2011-10-26 33 views
23

Por ejemplo, tengo 2 proyectos de Maven. Uno es "proyecto-padre". El otro es "proyecto-niño". Obviamente, "proyecto-hijo" es el proyecto secundario de "proyecto-padre".Cómo excluir una dependencia del proyecto principal en Maven?

"project-parent" tiene una dependencia de log4j. Pero quiero excluirlo del "proyecto-hijo". ¿Hay alguna manera?

Se podría decir que debo mover log4j de "project-parent" a "project-child". Eso es totalmente correcto. Pero la suposición es que NO PUEDO modificar el POM del "padre del proyecto".

Gracias de antemano.

Respuesta

9

Creo que en Maven2 no hay forma de lograr esto, porque esto es lo que la herencia POM es para . 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, desplegarlo como log4j: log4j, con una versión obviamente anormal (por ejemplo, log4j: log4j: 9999). Agregue tal dependencia en su proyecto-hijo. Luego, anulará la dependencia de parent para depender de un JAR vacío de hecho.

+1

Una nota al margen: alguien está haciendo algo similar y proporciona un repositorio público para este tipo de artefactos "vacías" (http://version99.qos.ch/) . Usan '99-empty' como la versión. La gente considera que el enfoque sugerido por mí puede usar esto como una convención. –

1

Si entiendo la pregunta, lo que necesita es algo como lo siguiente. Reúne una dependencia y excluye esa dependencia de agregar a su lista de dependencia. A menudo, esto se utiliza si desea inyectar una versión más nueva de un paquete en lugar del que se hace referencia 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 está en su lugar hablando de una relación <parent> entonces no estoy seguro que hay una manera de hacer esto. ¿Se puede pasar de ser un <parent> a un <dependency>?

+0

Me refiero a una dependencia heredada del proyecto principal, no a la dependencia transitiva de la dependencia directa como su ejemplo. De todos modos, muchas gracias. :) – Smartmarkey

+0

Sí, no estoy seguro si puedes hacer eso. ¿Has visto esta pregunta ?: http://stackoverflow.com/questions/2681759/is-there-anyway-to-exclude-artifacts-inherited-from-a-parent-pom – Gray

+0

Gracias por el enlace. Lo he leído Parece que no hay forma en Maven formalmente. Tengo que hacer una especie de solución. – Smartmarkey

9

No conozco una forma de excluir realmente una dependencia, pero puede excluirla de la distribución de destino, pero es un truco. Debe cambiar el alcance de la dependencia a algo que pueda excluir en la distribución final.

Por lo tanto, decir que mi padre tenía una dependencia de JUnit 4.8, en mi pom que decir:

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.8</version> 
    <scope>provided</scope> 
</dependency> 

por lo que estamos cambiando el alcance para siempre. Para una explicación de cómo funciona esto, vea mi respuesta al NoClassDefFoundError: org/junit/AfterClass during annotation processing. Por desgracia, esto no afecta a la construcción, pero cuando se está copiando las dependencias para la distribución final, se puede utilizar el elemento de configuración excludeScope a 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> 
+0

Gracias. He excluido las dependencias no deseadas del paquete de distribución, pero estoy usando en assembly.xml del complemento Maven Assembly para ello. Estoy pidiendo una forma de excluir dependencias no deseadas del entorno de desarrollo, como Eclipse. :) – Smartmarkey

0

Una forma hacky para lograr esto es especificar la dependencia en project-child pero con el alcance 'test' (o el alcance de peso más ligero disponible). Esto "ocultará" el alcance especificado en project-parent para que esté disponible solo para probar el código y no esté disponible para el código que no es de 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 project-child tenía un proyecto-hermano con una dependencia de alcance 'compilar', mientras que project-parent tenía la misma dependencia especificada (en realidad heredada de un abuelo) con alcance 'provisto'. project-child era un ejecutable que dependía de project-sibling, por lo que se generó NoClassDefFoundError en el tiempo de ejecución desde project-sibling desde que se usaba classpath en tiempo de ejecución de project-child, que no incluía la dependencia 'proporcionada'.Lo arreglé moviendo la dependencia 'compilar' de project-sibling a project-parent para que 'compile' pudiera "ocultar" el 'proporcionado'.

1

He encontrado la misma pregunta que usted. En mi proyecto, llame al padre pom es parent.pom. matriz define 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> 

proyecto secundario invocar alguna dependencia en child.pom. Pero no quiero la dependencia log4j-1.2.x y quiero aumentar la versión de slf4j.

So. Agrego la dependencia de los padres

<dependency> 
     <groupId>parent</groupId> 
     <artifactId>myartifactId</artifactId> 
     <version>${my parent version}</version> 
</dependency> 

y utilizar 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 añadir explícitamente el slf4j y la dependencia de log4j2 en pom niño

<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> 

entonces use mvn dependency: tree to mostrar la lista de dependencias, sigue apareciendo el 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 

bien, vamos a añadir las exclusiones en la que la dependencia ... suprimir 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! clara ~

esperanza que puede ayudarle a:>

Cuestiones relacionadas