web-dev-qa-db-fra.com

Qu'est-ce qu'un gros pot?

J'ai entendu des gens dire qu'ils créaient un gros JAR et le déployaient. Que veulent-ils dire en réalité?

110
erwaman

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>
85
Dmitry Ginzburg

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:

  • les fichiers jar des dépendances sont copiés dans le fichier jar principal, puis chargés à l'aide d'un chargeur de classe spécial (onejar).
  • les jarres des dépendances sont extraites au sommet de la hiérarchie principale des jarres (le plugin maven-Assembly avec son assemblage jar-with-dependencies, le plugin maven-shade-avec l'objectif d'ombrage)

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>
12
MeTTeO

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.

9
Sridhar Sarnobat

Les différents noms ne sont que des moyens de personnaliser les applications Java.

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

Visual representation of JAR types

1
Mark Han

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);
0
Jerome Angibaud