2010-11-30 20 views
17

Creo el archivo de mi aplicación con el complemento de ensamblaje de maven. Toda la dependencia presente en mi pom se incluye sin ningún problema.Ensamblaje de Maven: agregue una versión diferente del mismo artefacto

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

Si en mi pom puse

<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 la fuente de la resolución dependenvcy eliminar la versión anterior y sólo el 1.1.0 se empaqueta en el archivo

trato de incluir el frasco mediante el uso de ensamblaje archivo descriptor xml Y no encontré ninguna solución.

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

¿Alguna idea?

+0

No se preocupe por la necesidad/conflicto/.. nada más. – Vlagorce

Respuesta

12

Encontré una solución usando maven-dependency-plugin para copiar dependencias pom resueltas y jar 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 sólo tiene que añadir las siguientes líneas en mi xml montaje

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

puede preguntar si hace esto, cuando ambas versiones se cargan en jvm, ¿no debería haber un conflicto? –

+0

Tenía exactamente el mismo requisito y su solución ahorró tiempo. @lucky_start_izumi - lo hace en la mayoría de los casos, pero en mi caso es para una aplicación que usa YAJSW que necesitaba una biblioteca más antigua y mi aplicación necesitaba una más nueva. En mi caso, se ejecutan en diferentes classpaths. –

10

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 nueva reemplaza a la versión anterior. Si no, no es el mismo módulo. Le sugiero que le dé un nombre diferente al módulo más nuevo y se asegure de que tenga diferentes paquetes para evitar chocar con un módulo aleatorio.

En general, Maven intentó alentar el buen diseño de las aplicaciones y dificulta deliberadamente hacer las cosas que ha determinado que son una mala idea.

+0

Este jar tiene diferentes clases con diferentes nombres de paquete. Se cargarán mediante el uso de ServiceLoader para construir diferentes modelos xml para mantener la compatibilidad. Creo que en mi caso no es una mala práctica. Trataré de ver si es posible y no aburrido cambiar el nombre en cada lanzamiento. – Vlagorce

+2

Yo respondería por el cambio de nombre dos, si vas a usar ambos. –

+0

Por supuesto que sí! Todo es diferente, solo el groupeid y el artefactid son iguales. – Vlagorce

1

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

0

Estoy de acuerdo, diferentes versiones significa reemplazar la anterior. Si tenemos que consumir dos versiones diferentes de un servicio web por algún requisito comercial. Es una buena idea generar los stubs en diferentes paquetes y al agregar a maven, puede especificarlos diferentes en groupid. Esto debería funcionar.

Cuestiones relacionadas