Configurazione del plugin Maven Shade per creare uber jar contenente solo i sottomoduli basati nello stesso groupId
Avere la seguente situazione:
- STS
- Giava
- Esperto di
Machine One
area di lavoro-01
l'app Java con Maven è basata su un singolo modulo. Viene installato ( mvn install
) nel repository e il master-project.jar
file in un'altra macchina viene installato e utilizzato per altri progetti come
<dependency>
<groupId>com.manuel.jordan</groupId>
<artifactId>master-project</artifactId>
<version>0.0.1.SNAPSHOT</version>
</dependency>
Fino a qui tutto funziona bene
area di lavoro-02
L'app è cresciuta e in un altro spazio di lavoro l'app è stata migrata per funzionare con più moduli
Assumiamo la seguente struttura per semplicità
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>)
Sono in grado di compilare tutti questi moduli. Quindi costruisci il successo
Obbiettivo
Ora l'obiettivo è generare lo stesso master-project.jar
file includendo i sottomoduli come i vasi interni.
Dopo aver fatto una ricerca la soluzione è: maven-shade-plugin
- A cosa serve il plug-in Maven-Shade e perché dovresti spostare i pacchetti Java?
Ho la seguente configurazione (parte di essa) usando come riferimento i seguenti collegamenti e altre fonti:
- Crea file JAR come aggregazione nel pacchetto multi modulo Maven
Perciò:
<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>
Con la configurazione corrente avviene quanto segue:
Per ogni modulo all'interno della target
directory:
- Con
<packaging>pom</packaging>
genera un.pom
file - Con
<packaging>jar</packaging>
genera due.jar
file, uno del sottomodulo stesso e l'altro del vaso uber (sì per ogni modulo)
Obiettivo: qual è la configurazione aggiuntiva o mancante per generare qualcosa di simile:
master-project.jar containing
module1.jar
module2.jar
...
module3.jar
Dove ognuno module#
ha la stessa <groupId>com.manuel.jordan</groupId>
dichiarazione, ecco perché l'ho dichiarato
<configuration>
<artifactSet>
<includes>
<include>com.manuel.jordan</include>
</includes>
</artifactSet>
</configuration>
E osserva che il pom.xml
file root / principale ha<packaging>pom</packaging>
Obbiettivo
L'obiettivo quindi è che l'altro progetto situato nell'altra macchina tenga in pace
<dependency>
<groupId>com.manuel.jordan</groupId>
<artifactId>master-project</artifactId>
<version>0.0.1.SNAPSHOT</version>
</dependency>
Quindi non importa se il master-project
progetto è singolo o multi-modulo
Risposte
Potresti creare un modulo jar di packaging sotto il tuo progetto principale con una dipendenza dagli altri moduli e includere solo lì la configurazione del plugin delle ombre