Configurazione del plugin Maven Shade per creare uber jar contenente solo i sottomoduli basati nello stesso groupId

Aug 19 2020

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.jarfile 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.jarfile 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 targetdirectory:

  • Con <packaging>pom</packaging>genera un .pomfile
  • Con <packaging>jar</packaging>genera due .jarfile, 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.xmlfile 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-projectprogetto è singolo o multi-modulo

Risposte

1 CésarAlves Sep 21 2020 at 23:43

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