Configuración del complemento Maven Shade para crear uber jar que contenga solo los submódulos basados ​​en el mismo groupId

Aug 19 2020

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.jararchivo 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.jararchivo 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 targetdirectorio:

  • Con <packaging>pom</packaging>genera un .pomarchivo
  • Con <packaging>jar</packaging>genera dos .jararchivos, 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.xmlarchivo 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-projectproyecto es ya sea sola o varios módulos

Respuestas

1 CésarAlves Sep 21 2020 at 23:43

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