java - proyecto - maven tutorial español
¿Cómo excluir una dependencia del proyecto de los padres en Maven? (5)
Creo que en Maven2 no hay forma de lograr esto, porque para eso es la herencia POM. Sin embargo, hay un truco que se me ocurre:
Supongamos que tiene derecho a cargar artefactos en su repositorio interno de artefactos. Puede crear un JAR vacío, implementarlo como log4j: log4j, con una versión obviamente anormal (por ejemplo, log4j: log4j: 9999). Agregue tal dependencia en su proyecto-niño. Luego, anulará la dependencia de los padres a un JAR vacío de hecho.
Por ejemplo, tengo 2 proyectos Maven. Uno es "proyecto-padre". El otro es "proyecto-niño". Obviamente, "project-child" es el subproyecto de "project-parent".
"project-parent" tiene una dependencia de log4j. Pero quiero excluirlo del "proyecto-niño". ¿Hay alguna manera?
Podría decir que debería mover log4j de "project-parent" a "project-child". Eso es totalmente correcto. Pero el supuesto es que NO PUEDO modificar el POM de "proyecto-padre".
Gracias por adelantado.
Me he encontrado con la misma pregunta como tú. En mi proyecto, vamos a llamar al pom padre es parent.pom. padre definió el log4j, slf4j así:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j-api.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j-api.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j-log4j12.version}</version>
</dependency>
El proyecto hijo invoca alguna dependencia en child.pom. Pero no quiero la dependencia log4j-1.2.x y quiero aumentar la versión de slf4j.
Asi que. Añado la dependencia de los padres.
<dependency>
<groupId>parent</groupId>
<artifactId>myartifactId</artifactId>
<version>${my parent version}</version>
</dependency>
y usar exclusiones para eliminar el log4j
<dependency>
<groupId>parent</groupId>
<artifactId>myartifactId</artifactId>
<version>${my parent version}</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
y agregue explícitamente la dependencia de slf4j y log4j2 en pom hijo
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.6</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.4</version>
</dependency>
luego use mvn dependency: tree para mostrar la lista de dependencias, aún vea log4j
[INFO] +- org.apache.kafka:kafka_2.10:jar:0.8.2.0:compile
[INFO] | +- com.yammer.metrics:metrics-core:jar:2.2.0:compile
[INFO] | +- org.scala-lang:scala-library:jar:2.10.4:compile
[INFO] | +- org.apache.zookeeper:zookeeper:jar:3.4.6:compile
[INFO] | | +- org.slf4j:slf4j-log4j12:jar:1.7.5:compile
[INFO] | | +- log4j:log4j:jar:1.2.17:compile
Bueno, agreguemos las exclusiones de esa dependencia ... remueve a este tipo.
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>0.10.1.1</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
luego ejecute el comando nuevamente para verificar la lista de dependencias. ¡DE ACUERDO! claro ~
Espero que te pueda ayudar:>
No conozco una forma de excluir realmente una dependencia, pero puede excluirla de la distribución de destino, pero es un poco difícil. Debe cambiar el alcance de la dependencia a algo que pueda excluir en la distribución final.
Entonces, digamos que mi padre tenía una dependencia en Junit 4.8, en mi pom dice:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8</version>
<scope>provided</scope>
</dependency>
Así que estamos cambiando el alcance a provisto. Para obtener una explicación de cómo funciona esto, vea mi respuesta a NoClassDefFoundError: org / junit / AfterClass durante el proceso de anotación . Desafortunadamente, esto no afecta a la compilación, pero cuando está copiando las dependencias para la distribución final, puede usar el elemento de configuración excludeScope
para no copiar la dependencia en la distribución final:
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-libs</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeScope>provided</excludeScope>
</configuration>
</execution>
Si entiendo la pregunta, lo que necesitas es algo como lo siguiente. Extrae una dependencia y excluye que la dependencia se agregue a su lista de dependencias. A menudo, esto se utiliza si desea inyectar una versión más nueva de un paquete en lugar de la referenciada en el otro paquete.
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
...
</exclusions>
...
Si en cambio está hablando de una relación de <parent>
, no estoy seguro de que haya una manera de hacerlo. ¿Puedes pasar de ser un <parent>
a una <dependency>
?
Una forma pirata de lograr esto es especificar la dependencia en el proyecto-niño pero con el alcance de "prueba" (o el alcance más ligero disponible). Esto "ocultará" el alcance especificado en el proyecto-padre para que esté disponible solo para el código de prueba, y no esté disponible para el código de no prueba tanto en compilación como en tiempo de ejecución.
Me encontré con esta característica de error principalmente por error. En mi caso, mi hijo de proyecto tenía un hermano de proyecto con una dependencia de alcance ''compilar'', mientras que el proyecto-padre tenía la misma dependencia especificada (en realidad heredada de un abuelo) con el alcance ''provisto''. project-child era un ejecutable, sin embargo, dependía de project-brother, por lo que se lanzó NoClassDefFoundError en el tiempo de ejecución desde project-brother desde que se estaba utilizando classpath del tiempo de ejecución del proyecto child, que no incluía la dependencia ''proporcionada''. Arreglé esto al mover la dependencia ''compilar'' de proyecto-hermano a proyecto-padre para que el ''compilar'' ocultara "el ''proporcionado''.