Configuração do plugin Maven Shade para criar uber jar contendo apenas os submódulos baseados no mesmo groupId
Tendo a seguinte situação:
- STS
- Java
- Maven
Máquina Um
espaço de trabalho-01
o aplicativo Java com Maven é baseado em um único módulo. É instalado ( mvn install
) no repositório e o master-project.jar
arquivo em outra Máquina é instalado e usado para outro projeto como
<dependency>
<groupId>com.manuel.jordan</groupId>
<artifactId>master-project</artifactId>
<version>0.0.1.SNAPSHOT</version>
</dependency>
Até aqui tudo funciona bem
espaço de trabalho-02
O aplicativo cresceu e em outro espaço de trabalho o aplicativo foi migrado para funcionar com vários módulos
Vamos assumir a seguinte estrutura 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>)
Sou capaz de compilar todos esses módulos. Portanto, construa o sucesso
Objetivo
Agora o objetivo é gerar o mesmo master-project.jar
arquivo incluindo os submódulos como os jars internos.
Depois de fazer uma pesquisa a solução é: maven-shade-plugin
- Para que é usado o plug-in maven-shadow e por que você deseja realocar os pacotes Java?
Eu tenho a seguinte configuração (parte dela) usando como referência os seguintes links e outras fontes:
- Crie o arquivo JAR como agregação no pacote de vários módulos maven
Portanto:
<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>
Com a configuração atual acontece o seguinte:
Para cada módulo dentro do target
diretório:
- Com
<packaging>pom</packaging>
gera um.pom
arquivo - Com
<packaging>jar</packaging>
gera dois.jar
arquivos, um do próprio submódulo e outro do uber jar (sim para cada módulo)
Objetivo: qual é a configuração extra ou ausente para gerar algo assim:
master-project.jar containing
module1.jar
module2.jar
...
module3.jar
Onde cada um module#
tem a mesma <groupId>com.manuel.jordan</groupId>
declaração, é por isso que declarei
<configuration>
<artifactSet>
<includes>
<include>com.manuel.jordan</include>
</includes>
</artifactSet>
</configuration>
E observe que o pom.xml
arquivo raiz / principal tem<packaging>pom</packaging>
Objetivo
Portanto o objetivo é que o outro projeto localizado na outra máquina fique em paz
<dependency>
<groupId>com.manuel.jordan</groupId>
<artifactId>master-project</artifactId>
<version>0.0.1.SNAPSHOT</version>
</dependency>
Assim, não importa se o master-project
projeto é único ou multi-módulo
Respostas
Você poderia fazer um módulo jar de embalagem abaixo de seu projeto-mestre com uma dependência para os outros módulos e incluir apenas lá a configuração do plugin de sombra