2011-10-26 166 views
23

例如,我有2个Maven项目。一个是“项目 - 父母”。另一个是“项目孩子”。显然,“项目 - 子女”是“项目 - 父母”的子项目。如何在Maven中从父项目中排除依赖项?

“project-parent”具有log4j的依赖性。但我想把它从“项目孩子”中排除出去。有没有办法?

你可能会说我应该将log4j从“project-parent”移动到“project-child”。这是完全正确的。 但假设是我不能修改“project-parent”的POM。

在此先感谢。

回答

9

我觉得在Maven2中没有办法实现这个,因为这是POM继承的 。然而,我可以想到一个技巧:

假设您有权将工件上传到您的内部工件存储库。您可以创建一个空的JAR,将其部署为log4j:log4j,显然具有异常版本(例如log4j:log4j:9999)。在您的项目子项中添加这样的依赖项。然后它将覆盖父对象的依赖关系取决于事实上为空的JAR。

+1

一个侧面说明:有人在做类似的事情,并提供了这样那样的“空”神器公共仓库(http://version99.qos.ch/) 。他们使用'99-empty'作为版本。人们认为我提出的方法可能会将此用作惯例。 –

1

如果我明白了这个问题,你需要的是类似下面的东西。它引入一个依赖项,并排除该依赖项添加到其依赖项列表中。如果你想注入一个更新版本的包而不是其他包中引用的包,通常会使用它。

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.15</version> 
    <exclusions> 
     <exclusion> 
      <groupId>com.sun.jmx</groupId> 
      <artifactId>jmxri</artifactId> 
     </exclusion> 
     ... 
    </exclusions> 
    ... 

如果您是不是在谈论一个<parent>关系,然后我不知道是有办法做到这一点。你能否从<parent>切换到<dependency>

+0

我的意思是父项目的继承依赖项,而不是直接依赖项的传递依赖项。无论如何,非常感谢。 :) – Smartmarkey

+0

是的,我不知道你是否可以做到这一点。你看到这个问题:http://stackoverflow.com/questions/2681759/is-there-anyway-to-exclude-artifacts-inherited-from-a-parent-pom – Gray

+0

感谢您的链接。我读过它。看起来Maven正式没有办法。我必须做一种解决方法。 – Smartmarkey

9

我不知道实际排除依赖关系的方法,但可以将它从目标分布中排除,但这有些破绽。您需要将依赖项的范围更改为您可以在最终分配中排除的内容。

所以说,我的父母对的JUnit 4.8的依赖关系,在我的POM你说:

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

所以,我们正在改变的范围提供。有关这是如何工作的解释,请参阅我对NoClassDefFoundError: org/junit/AfterClass during annotation processing的回答。不幸的是,这并不影响身材,但是当你复制的依赖关系为最终分配,你可以使用excludeScope配置元素的依赖性不复制到最后分配:

<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

谢谢。我已经从发行包中排除了不需要的依赖关系,但是我在Maven Assembly插件的assembly.xml中使用了。我正在寻求一种从dev环境中排除不需要的依赖关系的方法,如Eclipse。 :) – Smartmarkey

0

一个哈克的方式要完成这个工作就是在project-child中指定依赖项,但是在'test'范围内(或任何最轻量级的可用范围)。这将“隐藏”project-parent中指定的作用域,以便它仅在测试代码时可用,在编译和运行时都不可用于非测试代码。

我偶然发现了这个bug功能。就我而言,我的项目子项目具有“编译”范围依赖关系的项目兄弟,而项目父项具有与“提供”范围指定的相同的依赖关系(实际上是从祖父母继承的)。 project-child是一个可执行文件,但是依赖于项目兄弟,因此在运行时从project-sibling引发了NoClassDefFoundError,因为正在使用project-child的运行时类路径,它不包括“提供的”依赖项。我通过将'compile'依赖从project-sibling移动到project-parent来解决这个问题,这样'compile'将“隐藏”'provided'。

1

我遇到了和你一样的问题。 在我的项目中,让我们称父pom为parent.pom。 parent定义了log4j,slf4j是这样的:

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

子项目在child.pom中调用一些依赖项。但我不希望log4j-1.2.x依赖,并想增加slf4j的版本。

所以。我想补充母公司的依赖

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

,并使用排除删除log4j的

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

,并明确添加SLF4J和log4j2的儿童pom的依赖

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

然后使用mvn依赖:树到显示依赖关系列表中,仍然可以看到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 

好了,让我们添加的排除上的依赖......除去这个家伙。

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

然后再次运行该命令以检查依赖关系列表。好!明确〜

希望可以帮助您:>

相关问题