specify artefact java maven-2 maven-plugin maven-assembly-plugin

java - specify - Ensamblaje de Maven: agregar diferentes versiones del mismo artefacto



maven repository (4)

Creo el archivo de mi aplicación con el complemento de ensamblado de Maven. Todas las dependencias presentes en mi pom están incluidas sin ningún problema.

Ahora necesito incluir dos o más versiones del mismo artefacto.

Si en mi pom pongo

<dependencies> [...] <dependency> <groupId>db.test</groupId> <artifactId>my-model</artifactId> <version>1.0.3</version> </dependency> <dependency> <groupId>db.test</groupId> <artifactId>my-model</artifactId> <version>1.1.0</version> </dependency> </dependencies>

De origen, el resolvervcy resolver elimina la versión anterior y solo el 1.1.0 está empaquetado en el archivo

Intento incluir el archivo jar mediante el uso del archivo descriptor de XML. Y no encontré ninguna solución.

Una posible solución será colocar manualmente todo el model.jar necesario dentro de una carpeta e indicar al ensamblaje que lo copie en el archivo. Pero estoy buscando una solución más configurable.

Alguna idea ?


Encontré una solución utilizando el complemento de dependencia de maven para copiar las dependencias pom resueltas y el archivo adicional.

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.1</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <overWriteReleases>false</overWriteReleases> <overWriteSnapshots>false</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> <includeScope>runtime</includeScope> </configuration> </execution> <execution> <id>copy-model</id> <phase>package</phase> <goals> <goal>copy</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>my.test.pkg</groupId> <artifactId>my-model</artifactId> <classifier>server</classifier> <version>1.0.3</version> <type>jar</type> </artifactItem> <artifactItem> <groupId>my.test.pkg</groupId> <artifactId>my-model</artifactId> <classifier>server</classifier> <version>1.1.0</version> <type>jar</type> </artifactItem> </artifactItems> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions>

Ahora solo tengo que agregar las siguientes lineas en mi ensamblado xml

<fileSet> <directory>${project.build.directory}/lib</directory> <outputDirectory>/lib</outputDirectory> <filtered>false</filtered> <includes> <include>*.jar</include> </includes> <fileMode>0600</fileMode> </fileSet>


Estoy de acuerdo, diferentes versiones significa reemplazar la anterior. Si tenemos que consumir dos versiones diferentes de un servicio web para algún requerimiento comercial. Es una buena idea generar los apéndices en diferentes paquetes y al agregar a Maven puede especificar diferentes en groupid . Esto debería funcionar.


Maven asume que no tiene ningún sentido tener más de una versión de un módulo a la vez. Se supone que una versión más reciente reemplaza a la versión anterior. Si no lo hace no es el mismo módulo. Le sugiero que le dé un nombre diferente al módulo más nuevo y que se asegure de que tenga paquetes diferentes para evitar elegir un módulo aleatorio.

En general, Maven intentó fomentar un buen diseño de la aplicación y hace que deliberadamente sea difícil hacer las cosas que ha determinado que son una mala idea.


Otra solución fea podría ser utilizar superposiciones de archivos WAR, aprovechando el hecho de que este mecanismo no presta atención a las versiones de los archivos JAR de componentes al aplicar las superposiciones.