Los artefactos de las dependencias se pueden excluir declarando un <exclusions>
elemento dentro de un <dependency>
Pero en este caso es necesario excluir un artefacto heredado de un proyecto principal. A continuación, se muestra un extracto del POM en discusión:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>jruby</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<artifactId>base</artifactId>
<groupId>es.uniovi.innova</groupId>
<version>1.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>ALL-DEPS</artifactId>
<version>1.0</version>
<scope>provided</scope>
<type>pom</type>
</dependency>
</dependencies>
</project>
base
artefacto, depende javax.mail:mail-1.4.jar
y ALL-DEPS
depende de otra versión de la misma biblioteca. Debido al hecho de que mail.jar
desde ALL-DEPS
existe en el entorno de ejecución, aunque no se exporta, choca con el mail.jar
que existe en el padre, que tiene el alcance compile
.
Una solución podría ser eliminar mail.jar del POM principal, pero la mayoría de los proyectos que heredan la base la necesitan (como es una dependencia transtiva para log4j). Entonces, lo que me gustaría hacer es simplemente excluir la biblioteca principal del proyecto secundario , ya que se podría hacer si base
fuera una dependencia y no el pom principal:
...
<dependency>
<artifactId>base</artifactId>
<groupId>es.uniovi.innova</groupId>
<version>1.0.0</version>
<type>pom<type>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
</exclusions>
</dependency>
...
Puede agrupar sus dependencias dentro de un proyecto diferente con un paquete
pom
como se describe en las Mejores prácticas de Sonatypes :y haga referencia a ellos desde su parent-pom (observe la dependencia
<type>pom</type>
):Su proyecto hijo hereda este pom principal como antes. Pero ahora, la dependencia de correo se puede excluir en el proyecto hijo dentro del
dependencyManagement
bloque:fuente
No uses un pom principal
Esto puede sonar extremo, pero de la misma manera que el "infierno de la herencia" es una razón por la que algunas personas dan la espalda a la Programación Orientada a Objetos (o prefieren la composición a la herencia ), eliminan el
<parent>
bloque problemático y copian y pegan lo<dependencies>
que necesiten (si su equipo le da esta libertad).Se debe ignorar la suposición de que la división de poms en padres e hijos para "reutilizarlos" y "evitar la redundancia" debe ser ignorada y usted debe atender sus necesidades inmediatas primero (la cura es peor que la enfermedad). Además, la redundancia tiene sus ventajas, a saber, la independencia de los cambios externos (es decir, la estabilidad).
Esto es más fácil de lo que parece si genera el pom efectivo (eclipse lo proporciona pero puede generarlo desde la línea de comandos con
mvn help:effective
).Ejemplo
Quiero usarlo
logback
como mi enlace slf4j, pero mi pom principal incluye lalog4j
dependencia. No quiero ir y tener que empujar la dependencia de los otros niños a log4j en sus propiospom.xml
archivos para que el mío no esté obstruido.fuente
Redefina la dependencia (en el pom hijo) con el
scope
sistema apuntando a un frasco vacío:El frasco puede contener solo un archivo vacío:
fuente
notepad empty.class
a continuación,jar cvf empty.jar empty.class
para generar un frasco vacío.¿Ha intentado declarar explícitamente la versión de mail.jar que desea? La resolución de dependencia de Maven debería usar esto para la resolución de dependencia sobre todas las demás versiones.
fuente
La mejor opción es hacer que las dependencias que no siempre desea heredar sean intransitivas.
Puede hacer esto marcándolos en el pom principal con el alcance proporcionado.
Si aún desea que el padre administre las versiones de estos departamentos, puede usar la
<dependencyManagement>
etiqueta para configurar las versiones que desee sin heredarlas explícitamente o pasar esa herencia a los hijos.fuente
Cuando llama a un paquete pero no desea algunas de sus dependencias, puede hacer algo como esto (en este caso, no quería que se agregara el antiguo log4j porque necesitaba usar el más nuevo):
Esto funciona para mí ... pero soy bastante nuevo en java / maven, por lo que tal vez no sea óptimo.
fuente
Realmente necesitaba hacer esta cosa sucia ... Así es como
Redefiní esas dependencias con alcance
test
. Scopeprovided
no funcionó para mí.Usamos el complemento Spring Boot para construir fat jar. Tenemos un módulo común que define bibliotecas comunes, por ejemplo Springfox swagger-2. Mi superservicio debe tener un padre en común (no quiere hacerlo, ¡pero las reglas de la compañía obligan!)
Entonces mi padre o los comunes tienen pom.
Y mi pom de súper servicio .
Este es el tamaño del artefacto de grasa final.
También vale la pena mencionar esta respuesta: quería hacerlo, pero soy vago ... https://stackoverflow.com/a/48103554/4587961
fuente
Podemos agregar el pom principal como una dependencia con el tipo pom y excluirlo. Porque de todos modos se descarga parent pom. Esto funcionó para mi
fuente