Je suis assez nouveau pour 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 en utilisant 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.
Réponses
Trop de publicités? Ajouter le plugin suivant à votre pom.xml
...
<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 contenant toutes les dépendances avec le suffixe "-jar-with-dependencies".
si vous voulez corriger classpath
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>
Peut-être vous voulez maven-ombre-plugin, paquet de dépendances, de minimiser le code inutilisé et masquer les dépendances externes pour éviter les conflits.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</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>
Références:
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 plug-in maven-assembly-afin d'obtenir cela dans le manifeste
Vous pouvez utiliser le onejar-maven-plugin pour l'emballage. Fondamentalement, il assemble votre projet et de ses dépendances comme un pot, y compris non seulement votre projet fichier jar, mais également de toutes les dépendances externes comme un "pot de pots", 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>
Note 1: options de Configuration est disponible sur le projet page d'accueil.
Note 2: Pour une raison ou l'autre, la onejar-maven-plugin projet n'est pas publiée à Maven Central. Cependant jolira.com pistes le projet d'origine, qu'il publie avec le groupId com.jolira
.