Configuration du plugin Maven Shade pour créer un fichier uber contenant uniquement les sous-modules basés dans le même groupId
Avoir la situation suivante:
- STS
- Java
- Maven
Machine un
espace de travail-01
l'application Java avec Maven est basée sur un seul module. Il est installé ( mvn install
) dans le référentiel et le master-project.jar
fichier sur une autre machine est installé et utilisé pour un autre projet comment
<dependency>
<groupId>com.manuel.jordan</groupId>
<artifactId>master-project</artifactId>
<version>0.0.1.SNAPSHOT</version>
</dependency>
Jusqu'à ce qu'ici tout fonctionne bien
espace de travail-02
L'application a grandi et dans un autre espace de travail, l'application a été migrée pour fonctionner avec des modules multiples
Supposons la structure suivante pour plus de simplicité
master-project (<packaging>pom</packaging>)
alpha (<packaging>jar</packaging>)
beta (<packaging>jar</packaging>)
numbers (<packaging>pom</packaging>)
one (<packaging>jar</packaging>)
two (<packaging>jar</packaging>)
countries (<packaging>pom</packaging>)
Europe (<packaging>pom</packaging>)
France (<packaging>jar</packaging>)
Italy (<packaging>jar</packaging>)
AmericaLatina (<packaging>pom</packaging>)
Peru (<packaging>jar</packaging>)
Argentina (<packaging>jar</packaging>)
Je suis capable de compiler tous ces modules. Par conséquent, construisez le succès
Objectif
Maintenant, le but est de générer le même master-project.jar
fichier, y compris les sous-modules comme les jars internes.
Après avoir fait une recherche, la solution est: maven-shade-plugin
- À quoi sert le plugin maven-shade et pourquoi voudriez-vous déplacer les packages Java?
J'ai la configuration suivante (une partie de celle-ci) en utilisant comment référencer les liens suivants et d'autres sources:
- Créer un fichier JAR en tant qu'agrégation dans le package multi-module maven
Par conséquent:
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging> <--- it is the main or root pom.xml file
<groupId>com.manuel.jordan</groupId>
<artifactId>master-project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
....
</properties>
<dependencies>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-all</artifactId>
<version>${hazelcast.version}</version>
<scope>provided</scope> <!-- Otherwise each uber jar within each submodule is 11.6MB -->
</dependency>
</dependencies>
<modules>
<module>...</module>
...
</modules>
<build>
<plugins>
....
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<id>create-fat-jar</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<includes>
<include>com.manuel.jordan</include>
</includes>
</artifactSet>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Avec la configuration actuelle se produit ce qui suit:
Pour chaque module du target
répertoire:
- Avec
<packaging>pom</packaging>
génère un.pom
fichier - Avec
<packaging>jar</packaging>
génère deux.jar
fichiers, l'un du sous-module lui-même et l'autre du fichier uber jar (oui pour chaque module)
Objectif: quelle est la configuration supplémentaire ou manquante pour générer quelque chose comme ceci:
master-project.jar containing
module1.jar
module2.jar
...
module3.jar
Là où chacun module#
a la même <groupId>com.manuel.jordan</groupId>
déclaration, c'est pourquoi j'ai déclaré
<configuration>
<artifactSet>
<includes>
<include>com.manuel.jordan</include>
</includes>
</artifactSet>
</configuration>
Et observez que le pom.xml
fichier racine / principal a<packaging>pom</packaging>
Objectif
Par conséquent, le but est que l'autre projet situé dans l'autre machine reste en paix
<dependency>
<groupId>com.manuel.jordan</groupId>
<artifactId>master-project</artifactId>
<version>0.0.1.SNAPSHOT</version>
</dependency>
Ainsi, peu importe que le master-project
projet soit mono -module ou multi-module
Réponses
Vous pouvez créer un module jar d'emballage sous votre projet maître avec une dépendance aux autres modules, et y inclure uniquement la configuration du plugin de l'ombre