2010-07-02 41 views
11

Tengo un proyecto que depende de un artefacto controlado por un proveedor. Este artefacto contiene algunas clases de las que dependo, y algunas que son más antiguas y causan problemas. ¿Hay alguna manera de que maven expanda automáticamente un jar, elimine las clases y las vuelva a empaquetar como una dependencia? Trataré de dar un ejemplo.Excluir clases de una dependencia en Maven

supplier:artifact:1.0.0 
com.supplier.useful.ClassA 
com.supplier.dto.ClassB (old) 

us:dependency:1.1.20 
com.supplier.dto.ClassB (new) 

us:project-web:1.1.20 
- supplier:artifact:1.0.0 
- us:dependency:1.1.20 

Por lo tanto - Tengo que utilizar ClassA en proyecto en la web, pero necesito utilizar el ClassB del dependency artefacto. No puedo modificar el proveedor: artefacto, o nosotros: dependencia.

¿Alguna idea ?!

Respuesta

8

Desde la versión 2.0.9 maven conserva el orden de la ruta de clases por lo que si define las clases parcheadas en un contenedor ANTES del proveedor, ocultará la implementación del proveedor.

Como alternativa, puede mirar el maven shade plugin, ya que hace exactamente lo que usted está pidiendo según yo.

5

Si está utilizando Maven 2.0.9+, simplemente coloque su clase en un jar y declare como dependencia antes de el artefacto de su proveedor. Como menciona @Peter, Maven usa el orden pom para el classpath desde Maven 2.0.9 (ver MNG-1412/MNG-3111).

Si por cualquier razón usted no está satisfecho con esta solución, entonces usted podría utilizar el Maven Dependency Plugin para descomprimir la dependencia en target/classes (que debe estar en la ruta de clase de compilación) usando dependency:unpack con un poco de excludes (ver Unpacking specific artifacts). Ni siquiera trataría de volver a empaquetarlo, esto introducirá complejidad inútil (reemplazar el antiguo jar con el nuevo en el classpath de compilación no será trivial, si es factible).

Cuestiones relacionadas