J'ai entendu des gens dire qu'ils créaient un gros JAR et le déployaient. Que veulent-ils dire en réalité?
Le gros jar est le jar, qui contient les classes de toutes les bibliothèques dont dépend votre projet et, bien sûr, les classes du projet en cours.
Dans différents systèmes de construction, fat jar est créé différemment. Par exemple, Gradle le créerait avec ( instruction ):
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
}
Dans Maven, cela se fait de cette manière (après avoir installé un bocal):
<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>
Fat jar ou uber jar est un fichier jar qui contient tous les fichiers de classe de projet et les ressources regroupées avec toutes ses dépendances. Il existe différentes méthodes pour obtenir cet effet:
Exemple de configuration du plug-in Assembly ci-dessous jar-with-dependencies :
<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>
Dans le cas d'un fichier jar exécutable, une autre façon de penser à un fichier jar gros est celle que vous pouvez exécuter en appelant:
Java -jar myFatLibrary.jar
sans avoir besoin de -cp
/--classpath
, ou même en double-cliquant sur l’icône jar.
Skinny - Contient SEULEMENT les bits que vous tapez littéralement dans votre éditeur de code, et RIEN d'autre.
Thin - Contient tout ce qui précède PLUS les dépendances directes de l’application de votre application (pilotes de base de données, bibliothèques d’utilitaires, etc.).
Hollow - L'inverse de Thin - Ne contient que les bits nécessaires à l'exécution de votre application, mais ne contient PAS l'application elle-même. Fondamentalement, un "serveur d'applications" préemballé sur lequel vous pouvez déployer ultérieurement votre application, dans le même style que les serveurs Java EE traditionnels, mais avec des différences importantes.
Fat/Uber - Contient le bit que vous écrivez littéralement [~ # ~] plus [~ # ~] le dépendances directes de votre application [~ # ~] plus [~ # ~] les bits nécessaires pour faire fonctionner votre application "seule".
Source: article de Dzone
Un gros pot contient simplement les mêmes classes qu'un pot classique + les classes de toutes leurs dépendances d'exécution.
Avec Jeka ( https://jeka.dev ), vous pouvez y parvenir par programme:
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"));
ou simplement en paramétrant Java:
javaPlugin.getProject().getMaker().defineMainArtifactAsFatJar(true);