Configuration du plugin Maven Shade pour créer un fichier uber contenant uniquement les sous-modules basés dans le même groupId

Aug 19 2020

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.jarfichier 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.jarfichier, 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 targetrépertoire:

  • Avec <packaging>pom</packaging>génère un .pomfichier
  • Avec <packaging>jar</packaging>génère deux .jarfichiers, 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.xmlfichier 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-projectprojet soit mono -module ou multi-module

Réponses

1 CésarAlves Sep 21 2020 at 23:43

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