Configuración del complemento Maven Shade para crear uber jar que contenga solo los submódulos basados en el mismo groupId
Tener la siguiente situación:
- STS
- Java
- Maven
Máquina uno
espacio de trabajo-01
la aplicación Java con Maven se basa en un solo módulo. Se instala ( mvn install
) en el repositorio y el master-project.jar
archivo en otra Máquina se instala y se usa para otro proyecto cómo
<dependency>
<groupId>com.manuel.jordan</groupId>
<artifactId>master-project</artifactId>
<version>0.0.1.SNAPSHOT</version>
</dependency>
Hasta aquí todo funciona bien
espacio de trabajo-02
La aplicación creció y en otro espacio de trabajo la aplicación se migró para trabajar con módulos múltiples.
Asumamos la siguiente estructura para simplificar
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>)
Puedo compilar todos estos módulos. Por lo tanto, construye el éxito
Objetivo
Ahora el objetivo es generar el mismo master-project.jar
archivo incluyendo los submódulos como los frascos internos.
Después de hacer una investigación, la solución es: maven-shade-plugin
- ¿Para qué se utiliza el plugin maven-shadow-plugin y por qué querría reubicar los paquetes de Java?
Tengo la siguiente configuración (parte de ella) usando cómo referencia los siguientes enlaces y otras fuentes:
- Cree un archivo JAR como agregación en el paquete de múltiples módulos de maven
Por lo tanto:
<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 configuración actual sucede lo siguiente:
Para cada módulo dentro del target
directorio:
- Con
<packaging>pom</packaging>
genera un.pom
archivo - Con
<packaging>jar</packaging>
genera dos.jar
archivos, uno del submódulo en sí y otro del uber jar (sí para cada módulo)
Objetivo: cuál es la configuración extra o faltante para generar algo como esto:
master-project.jar containing
module1.jar
module2.jar
...
module3.jar
Donde cada uno module#
tiene la misma <groupId>com.manuel.jordan</groupId>
declaración, por eso declaré
<configuration>
<artifactSet>
<includes>
<include>com.manuel.jordan</include>
</includes>
</artifactSet>
</configuration>
Y observe que el pom.xml
archivo raíz / principal tiene<packaging>pom</packaging>
Objetivo
Por tanto el objetivo es que el otro proyecto ubicado en la otra máquina se mantenga en paz
<dependency>
<groupId>com.manuel.jordan</groupId>
<artifactId>master-project</artifactId>
<version>0.0.1.SNAPSHOT</version>
</dependency>
Así que no importa si el master-project
proyecto es ya sea sola o varios módulos
Respuestas
Puede crear un módulo jar de empaquetado debajo de su proyecto maestro con una dependencia a los otros módulos, e incluir solo allí la configuración del complemento de sombra