Что такое толстый баночка?

Я слышал, что люди говорят, что они создают толстый JAR и развернуть его. Что они на самом деле значат?

3 ответа

Решение

Жирная фляга - это фляга, которая содержит классы из всех библиотек, от которых зависит ваш проект, и, конечно же, классы текущего проекта.

В разных системах сборки толстый jar создается по-разному, например, в Gradle его можно создать с помощью ( инструкция):

task fatJar(type: Jar) {
    manifest {
        attributes 'Main-Class': 'com.example.Main'
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

В Maven это делается следующим образом (после настройки обычного фляги):

<pluginrepositories>
    <pluginrepository>
        <id>onejar-maven-plugin.googlecode.com</id>
        <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url>
    </pluginrepository>
</pluginrepositories>

<!-- ... -->

<plugin>
    <groupid>org.dstovall</groupid>
    <artifactid>onejar-maven-plugin</artifactid>
    <version>1.4.4</version>
    <executions>
        <execution>
            <configuration>
                <onejarversion>0.97</onejarversion>
                <classifier>onejar</classifier>
            </configuration>
            <goals>
                <goal>one-jar</goal>
            </goals>
        </execution>
   </executions>
</plugin>

Различные имена - это просто способы упаковки Java-приложений.

Тощий - содержит ТОЛЬКО биты, которые вы буквально вводите в свой редактор кода, и НИЧЕГО больше.

Тонкий - содержит все вышеперечисленное ПЛЮС прямые зависимости приложения от вашего приложения (драйверы db, служебные библиотеки и т. Д.).

Hollow - противоположность Thin - содержит только биты, необходимые для запуска вашего приложения, но НЕ содержит самого приложения. По сути, это предварительно упакованный "сервер приложений", на котором вы позже сможете развернуть свое приложение, в том же стиле, что и традиционные серверы приложений Java EE, но с важными отличиями.

Fat / Uber - содержит бит, который вы буквально пишете сами, ПЛЮС прямые зависимости вашего приложения ПЛЮС биты, необходимые для запуска вашего приложения "самостоятельно".

Источник: статья из Dzone

Fat jar или uber jar - это jar, который содержит все файлы классов проекта и ресурсы, упакованные вместе со всеми его зависимостями. Существуют разные способы достижения такого эффекта:

  • JAR-файлы зависимостей копируются в основной JAR-файл и затем загружаются с использованием специального загрузчика классов (onejar).
  • jar зависимостей извлекается в верхней части основной иерархии jar (maven-assembly-plugin с его сборкой jar-with-dependencies, maven-shade-plugin с целью shade)

Ниже приведен пример конфигурации jar-с-зависимостями подключаемого модуля сборки:

<project>
  ...
  <build>
    ...
    <plugins>
      <plugin>
        <!-- NOTE: We don't need a groupId specification because the group is
             org.apache.maven.plugins ...which is assumed by default.
         -->
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <classifier
        </configuration>
        ...
</project>

В случае исполняемого jar, другой способ думать о толстом jar - это тот, который вы можете выполнить, вызвав:

java -jar myFatLibrary.jar

без необходимости -cp / --classpathили даже дважды щелкнув значок баночки.

Из документации Gradle

В пространстве Java приложения и их зависимости обычно упаковывались как отдельные JAR-файлы в одном дистрибутивном архиве. Это все еще происходит, но есть другой подход, который теперь стал распространенным: размещение классов и ресурсов зависимостей непосредственно в JAR приложения, создание так называемого Uber или толстого JAR.

вот демонстрация uberJar задача в build.gradle файл:

task uberJar(type: Jar) {
    archiveClassifier = 'uber'

    from sourceSets.main.output

    dependsOn configurations.runtimeClasspath
    from {
        configurations.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) }
    }
}

В этом случае мы берем зависимости проекта во время выполнения - configurations.runtimeClasspath.files â € ”и обертывание каждого из файлов JAR с zipTree()метод. В результате получается коллекция деревьев ZIP-файлов, содержимое которых копируется в Uber JAR вместе с классами приложений.

Толстый jar просто содержит те же классы, что и классический jar + классы из всех их зависимостей времени выполнения.

С Jeka ( https://jeka.dev/) вы можете добиться этого программно:

JkPathTreeSet.of(Paths.get("classes")).andZips(
    Paths.get("bouncycastle-pgp-152.jar"),
    Paths.get("classgraph-4.8.41.jar"),
    Paths.get("ivy-2.4.0.jar")
).zipTo(Paths.get("fat.jar"));

или просто параметрировав плагин Java:

javaPlugin.getProject().getMaker().defineMainArtifactAsFatJar(true);
Другие вопросы по тегам