Что такое толстый баночка?
Я слышал, что люди говорят, что они создают толстый 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
или даже дважды щелкнув значок баночки.
В пространстве 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);