Gestão multi-dependências de módulo Maven assembly plugin
-
14-11-2019 - |
Pergunta
Eu uso o Maven assembly plugin para criar um assembly para o meu multi-módulo de projeto.Existem dois aplicativos separados construído a partir de multi-módulo de projecto, cada uma com um conjunto distinto de dependências.Eu fiz um assembly personalizado descritor que reúne dois diretórios (para cada aplicação) com módulo de compilações e suas respectivas dependências.Ele faz tudo bem, mas uma coisa ele coloca dependências para ambos os módulos para cada assembleia.
O seguinte é uma versão simplificada do meu projeto, que tem exatamente o mesmo comportamento.
Considere um projeto que consiste de dois módulos e um módulo de assemblagem:
APP
module1
module2
assembly
Eu adicionei dependências apenas para demonstração:
com.test.app:module1:jar:1.0
\- commons-cli:commons-cli:jar:1.2:compile
com.test.app:module2:jar:1.0
\- commons-daemon:commons-daemon:jar:1.0.8:compile
Aqui está o pai POM:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>app</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>module1</module>
<module>module2</module>
<module>assembly</module>
</modules>
</project>
módulo1 POM:
<project>
<parent>
<groupId>com.test</groupId>
<artifactId>app</artifactId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.app</groupId>
<artifactId>module1</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</project>
module2 POM:
<project>
<parent>
<groupId>com.test</groupId>
<artifactId>app</artifactId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.app</groupId>
<artifactId>module2</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>commons-daemon</groupId>
<artifactId>commons-daemon</artifactId>
<version>1.0.8</version>
</dependency>
</dependencies>
</project>
assembleia POM:
<project>
<parent>
<groupId>com.test</groupId>
<artifactId>app</artifactId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.app</groupId>
<artifactId>assembly</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.2</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/descriptor.xml</descriptor>
</descriptors>
</configuration>
</plugin>
</plugins>
</build>
</project>
E, finalmente, a assembleia descritor:
<assembly>
<id>distribution</id>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>dir</format>
</formats>
<moduleSets>
<moduleSet>
<useAllReactorProjects>true</useAllReactorProjects>
<includes>
<include>com.test.app:module1:jar</include>
</includes>
<binaries>
<outputDirectory>module1</outputDirectory>
<unpack>false</unpack>
<dependencySets>
<dependencySet>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
</binaries>
</moduleSet>
<moduleSet>
<useAllReactorProjects>true</useAllReactorProjects>
<includes>
<include>com.test.app:module2:jar</include>
</includes>
<binaries>
<outputDirectory>module2</outputDirectory>
<unpack>false</unpack>
<dependencySets>
<dependencySet>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
</binaries>
</moduleSet>
</moduleSets>
</assembly>
Como você pode ver, a montagem é ligar para o pacote de fase.Então, quando eu executar
mvn package
a partir do diretório pai, eu tenho a seguinte montagem
module1/
commons-cli-1.2.jar
commons-daemon-1.0.8.jar
module1-1.0.jar
module2/
commons-cli-1.2.jar
commons-daemon-1.0.8.jar
module2-1.0.jar
Basicamente, o problema aqui é que module1 não depende commons-daemon, mas o assembly plugin tem incluído a dependência.Da mesma forma, com module2 e commons-cli.
Alguém pode explicar por que o assembly plugin funciona desta forma?
Uma que seria uma solução?
Solução
Eu sempre tive experiências semelhantes usando o assembly plugin com multi-módulo projetos onde o resultado final não era o que eu esperava.Espero que alguém pode proporcionar uma resposta mais precisa para a razão que está acontecendo e como utilizar melhor esses dois conceitos em conjunto.
Dito isto, uma possível alternativa seria a de ter module1 e module2 gerar sua própria assembléia artefatos que contenham suas respectivas jarras e dependências.Em seguida, você pode modificar o conjunto de sub-módulo pom arquivo de dependências gerado distribuição de artefatos a partir de seu irmão módulos e, em seguida, descompactá-las em uma nova montagem.
Em ambos os Module1 e Module2 do pom arquivos, você pode adicionar um assembly plugin de configuração para o pacote fase muito como você fez com a montagem de sub-módulo.
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.2</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptors>
<descriptor>src/main/assembly/descriptor.xml</descriptor>
</descriptors>
</configuration>
</plugin>
</plugins>
</build>
Módulo1 teria um src/main/assembly/descriptor.xml como este
<assembly>
<id>distribution</id>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>zip</format>
</formats>
<dependencySets>
<dependencySet>
<outputDirectory>module1</outputDirectory>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
</assembly>
E Module2 terá o mesmo src/main/assembly/descriptor.xml
<assembly>
<id>distribution</id>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>zip</format>
</formats>
<dependencySets>
<dependencySet>
<outputDirectory>module2</outputDirectory>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
</assembly>
Em seguida, no assembly/pom.xml você gostaria de adicionar o Módulo 1 e 2 zip artefatos como dependências
<dependencies>
<dependency>
<groupId>com.test.app</groupId>
<artifactId>module1</artifactId>
<version>1.0</version>
<type>zip</type>
<classifier>distribution</classifier>
</dependency>
<dependency>
<groupId>com.test.app</groupId>
<artifactId>module2</artifactId>
<version>1.0</version>
<type>zip</type>
<classifier>distribution</classifier>
</dependency>
</dependencies>
...e guarnição até o assembly/src/main/assembly/descriptor.xml arquivo para olhar como este
<assembly>
<id>distribution</id>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>dir</format>
</formats>
<dependencySets>
<dependencySet>
<useTransitiveDependencies>false</useTransitiveDependencies>
<unpack>true</unpack>
</dependencySet>
</dependencySets>
</assembly>
Como eu disse, esta seria uma possível contornar e, infelizmente, adiciona uma quantidade significativa de adicionais de configuração XML para o seu processo de criação.Mas funciona.