web-dev-qa-db-fra.com

Construire un pot de graisse en utilisant Maven

J'ai une base de code que je veux distribuer comme jar. Il dépend également des bocaux externes, que je souhaite regrouper dans le dernier bocal.

J'ai entendu dire que cela peut être fait avec maven-Assembly-plug-in, mais je ne comprends pas comment. Quelqu'un pourrait-il me donner des exemples?.

En ce moment, j'utilise un gros pot pour emballer le dernier pot. Je veux réaliser la même chose en utilisant Maven.

106
bianca

Remarque: Si vous êtes une application Spring-Boot, lisez la fin de la réponse

Ajoutez le plug-in suivant à votre pom.xml La dernière version peut être consultée à l'adresse https://mvnrepository.com/artifact/org.Apache.maven.plugins/maven-Assembly-plugin

      ... 
      <build>
      <plugins>
      <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-Assembly-plugin</artifactId>
            <version>CHOOSE LATEST VERSION HERE</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>

            </configuration>
            <executions>
                <execution>
                    <id>assemble-all</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        </plugins>
        </build>

Après la configuration de ce plug-in, l'exécution de mvn package produira deux fichiers JAR: un contenant uniquement les classes du projet et un second fichier Fat avec toutes les dépendances avec le suffixe "-jar-with-dependencies".

si vous voulez corriger classpath la configuration au moment de l'exécution, ajoutez également le plugin suivant

    <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
            <archive>
                <manifest>
                    <addClasspath>true</addClasspath>
                    <mainClass>fully.qualified.MainClass</mainClass>
                </manifest>
            </archive>
        </configuration>
    </plugin>

Pour les applications de démarrage printanier , utilisez simplement le plugin suivant (choisissez la version appropriée)

    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <fork>true</fork>
            <mainClass>${start-class}</mainClass>
        </configuration>
        <executions>
            <execution>
                  <goals>
                    <goal>repackage</goal>
                  </goals>
             </execution>
        </executions>
    </plugin>
127
Jigar Joshi

Vous pouvez utiliser le maven-shade-plugin .

Après avoir configuré le plug-in shade dans votre construction, la commande mvn package créera un seul fichier jar avec toutes les dépendances fusionnées.

52
phlogratos

Peut-être voudriez-vous que maven-shade-plugin regroupe les dépendances, minimise le code inutilisé et masque les dépendances externes pour éviter les conflits.

<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <minimizeJar>true</minimizeJar>
                        <createDependencyReducedPom>true</createDependencyReducedPom>
                        <dependencyReducedPomLocation>
                            ${Java.io.tmpdir}/dependency-reduced-pom.xml
                        </dependencyReducedPomLocation>
                        <relocations>
                            <relocation>
                                <pattern>com.acme.coyote</pattern>
                                <shadedPattern>hidden.coyote</shadedPattern>
                            </relocation>
                        </relocations>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Références:

35
ggrandes

en fait, en ajoutant le

<archive>
   <manifest>
    <addClasspath>true</addClasspath>
    <packageName>com.some.pkg</packageName>                     
    <mainClass>com.MainClass</mainClass>
  </manifest>
</archive>

la déclaration à maven-jar-plugin n'ajoute pas pour moi l'entrée principale de la classe dans le fichier manifeste. Je devais l'ajouter au maven-Assembly-plugin afin de l'inclure dans le manifeste

9
user3169330

Vous pouvez utiliser le onejar-maven-plugin pour l’emballage. Fondamentalement, il assemble votre projet et ses dépendances dans un seul fichier jar, y compris non seulement le fichier jar de votre projet, mais également toutes les dépendances externes sous forme de "fichier jar", par exemple.

<build>
    <plugins>
        <plugin>
            <groupId>com.jolira</groupId>
            <artifactId>onejar-maven-plugin</artifactId>
                <version>1.4.4</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>one-jar</goal>
                        </goals>
                    </execution>
                </executions>
        </plugin>
    </plugins>
</build>

Remarque 1: les options de configuration sont disponibles sur le projet page d'accueil .

Remarque 2: Pour une raison ou une autre, le projet onejar-maven-plugin n'est pas publié sur Maven Central. Cependant jolira.com suit le projet d'origine et le publie avec le groupId com.jolira.

5
matsev

Une alternative consiste à utiliser le plugin maven shade pour construire un uber-jar.

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version> Your Version Here </version>
    <configuration>
            <!-- put your configurations here -->
    </configuration>
    <executions>
            <execution>
                    <phase>package</phase>
                    <goals>
                            <goal>shade</goal>
                    </goals>
            </execution>
    </executions>
</plugin>
1
Stanislav