En Maven2, para excluir una sola dependencia transitiva, tengo que hacer algo como esto:
<dependency>
<groupId>sample.group</groupId>
<artifactId>sample-artifactB</artifactId>
<version>1</version>
<exclusions>
<exclusion>
<groupId>sample.group</groupId>
<artifactId>sample-artifactAB</artifactId>
</exclusion>
</exclusions>
</dependency>
El problema con este enfoque es que tengo que hacer esto para cada dependencia transitiva aportada por sample-artifactB
.
¿Hay alguna forma de usar algún tipo de comodín para excluir todas las dependencias transitivas a la vez en lugar de una por una?
maven-2
dependencies
pbreault
fuente
fuente
Respuestas:
Para maven2 no hay una manera de hacer lo que usted describe. Para maven 3, hay. Si está utilizando Maven 3, consulte otra respuesta para esta pregunta
Para maven 2, recomendaría crear su propio pom personalizado para la dependencia que tiene sus <exclusiones>. Para proyectos que necesitan usar esa dependencia, establezca la dependencia a su pom personalizado en lugar del artefacto típico. Si bien eso no necesariamente le permite excluir todas las dependencias transitivas con una sola <exclusión>, solo le permite escribir su dependencia una vez y todos sus proyectos no necesitan mantener listas de exclusión innecesarias y largas.
fuente
Lo que funcionó para mí (puede ser una característica más nueva de Maven) es simplemente hacer comodines en el elemento de exclusión.
Tengo un proyecto de varios módulos que contiene un módulo de "aplicación" al que se hace referencia en dos módulos empaquetados con WAR. Uno de esos módulos empaquetados con WAR realmente solo necesita las clases de dominio (y todavía no los he separado del módulo de la aplicación). Encontré esto para trabajar:
El comodín en groupId y artifactId excluye todas las dependencias que normalmente se propagarían al módulo utilizando esta dependencia.
fuente
Una cosa que he encontrado útil:
Si coloca la dependencia con las exclusiones en la sección de gestión de dependencias del POM principal para su proyecto, o en un POM de administración de dependencias importable, entonces no necesita repetir la exclusión (o la versión).
Por ejemplo, si su POM principal tiene:
Luego, los módulos en su proyecto pueden simplemente declarar la dependencia como:
El POM principal especificará tanto la versión como las exclusiones. Utilizo esta técnica para casi todos nuestros proyectos y elimina muchas repeticiones.
fuente
Hace tres años recomendé usar la Versión 99 No existe, pero ahora he descubierto una mejor manera, especialmente desde que la Versión 99 está fuera de línea:
En el POM principal de su proyecto, use maven-enforcer-plugin para fallar la compilación si la dependencia no deseada se arrastra a la compilación. Esto se puede hacer usando la regla de dependencias prohibidas del complemento :
Luego, cuando eso le avise sobre una dependencia no deseada, excluya en la
<dependencyManagement>
sección del POM principal :De esta manera, la dependencia no deseada no aparecerá accidentalmente (a diferencia de una
<exclusion>
que es fácil de olvidar), no estará disponible incluso durante el tiempo de compilación (a diferencia delprovided
alcance), no hay dependencias falsas (a diferencia de la Versión 99) y ' funcionará sin un repositorio personalizado (a diferencia de la Versión 99). Este enfoque incluso funcionará según la versión del artefacto, los clasificadores, el alcance o un ID de grupo completo; consulte la documentación para obtener más detalles.fuente
<configuration>
se ignora cuando se ejecuta el objetivo desde la línea de comandos y debe moverse hacia arriba directamente debajo<plugin>
.<dependencyManagement>
sección de los padres . Ejecutar unmvn dependency:tree
en ese proyecto específico no tendrá la dependencia excluida en absoluto. Pero todos los proyectos que importen esa dependencia no honrarán al<exclusions>
otro pom padre del proyecto: ¡el excluido se arrastrará! Tuve que pasar<exclusions>
a cada módulo pom directamente.Utilizo la siguiente solución alternativa: en lugar de tratar de excluir el artefacto en todas las dependencias apropiadas, dibujo la dependencia como "provista" en el nivel superior. Por ejemplo, para evitar enviar xml-apis "cualquier versión":
fuente
Actualmente, no hay forma de excluir más de una dependencia transitiva a la vez, pero hay una solicitud de función para esto en el sitio Maven JIRA:
https://issues.apache.org/jira/browse/MNG-2315
fuente
Hay una solución alternativa para esto, si establece el alcance de una dependencia en tiempo de ejecución , se excluirán las dependencias transitivas. Sin embargo, tenga en cuenta que esto significa que debe agregar un procesamiento adicional si desea empaquetar la dependencia del tiempo de ejecución.
Para incluir la dependencia del tiempo de ejecución en cualquier paquete, puede usar el objetivo de copia del complemento de dependencia de maven para un artefacto específico .
fuente
<scope>provided</scope>
lugar de hacerlo<scope>runtime</scope>
.si necesita excluir todas las dependencias transitivas de un artefacto de dependencia que va a incluir en un ensamblaje, puede especificar esto en el descriptor para el complemento de ensamblaje:
fuente
Si desarrolla bajo Eclipse, puede buscar en el gráfico de dependencia del Editor POM (pestañas avanzadas habilitadas) la dependencia que desea excluir de su proyecto y luego:
haga clic derecho sobre él -> "Excluir Maven Artifact ..." y Eclipse hará la exclusión por usted sin la necesidad de averiguar en qué dependencia está vinculada la lib.
fuente
¿Cuál es su razón para excluir todas las dependencias transitivas?
Si hay un artefacto en particular (como el registro común) que necesita excluir de cada dependencia, el enfoque de la Versión 99 no existe podría ayudar.
Actualización 2012: no use este enfoque. Utilice maven-enforcer-plugin y exclusiones . La versión 99 produce dependencias falsas y el repositorio de la versión 99 está fuera de línea (hay espejos similares, pero tampoco puede confiar en que permanezcan en línea para siempre; es mejor usar solo Maven Central).
fuente
En un problema similar, tuve la dependencia deseada declarada con el alcance proporcionado. Con este enfoque, las dependencias transitivas se obtienen pero NO se incluyen en la fase del paquete, que es lo que desea. También me gusta esta solución en términos de mantenimiento, porque no hay pom, o pom personalizado como en la solución de Whaley, necesario para mantener; solo necesita proporcionar la dependencia específica en el contenedor y listo
fuente
Usa el último maven en tu classpath. Eliminará los artefactos duplicados y mantendrá el último artefacto maven.
fuente