例如,我有2个Maven项目。一个是“项目 - 父母”。另一个是“项目孩子”。显然,“项目 - 子女”是“项目 - 父母”的子项目。如何在Maven中从父项目中排除依赖项?
“project-parent”具有log4j的依赖性。但我想把它从“项目孩子”中排除出去。有没有办法?
你可能会说我应该将log4j从“project-parent”移动到“project-child”。这是完全正确的。 但假设是我不能修改“project-parent”的POM。
在此先感谢。
例如,我有2个Maven项目。一个是“项目 - 父母”。另一个是“项目孩子”。显然,“项目 - 子女”是“项目 - 父母”的子项目。如何在Maven中从父项目中排除依赖项?
“project-parent”具有log4j的依赖性。但我想把它从“项目孩子”中排除出去。有没有办法?
你可能会说我应该将log4j从“project-parent”移动到“project-child”。这是完全正确的。 但假设是我不能修改“project-parent”的POM。
在此先感谢。
我觉得在Maven2中没有办法实现这个,因为这是POM继承的 。然而,我可以想到一个技巧:
假设您有权将工件上传到您的内部工件存储库。您可以创建一个空的JAR,将其部署为log4j:log4j,显然具有异常版本(例如log4j:log4j:9999)。在您的项目子项中添加这样的依赖项。然后它将覆盖父对象的依赖关系取决于事实上为空的JAR。
如果我明白了这个问题,你需要的是类似下面的东西。它引入一个依赖项,并排除该依赖项添加到其依赖项列表中。如果你想注入一个更新版本的包而不是其他包中引用的包,通常会使用它。
<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>
?
我的意思是父项目的继承依赖项,而不是直接依赖项的传递依赖项。无论如何,非常感谢。 :) – Smartmarkey
是的,我不知道你是否可以做到这一点。你看到这个问题:http://stackoverflow.com/questions/2681759/is-there-anyway-to-exclude-artifacts-inherited-from-a-parent-pom – Gray
感谢您的链接。我读过它。看起来Maven正式没有办法。我必须做一种解决方法。 – Smartmarkey
我不知道实际排除依赖关系的方法,但可以将它从目标分布中排除,但这有些破绽。您需要将依赖项的范围更改为您可以在最终分配中排除的内容。
所以说,我的父母对的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>
谢谢。我已经从发行包中排除了不需要的依赖关系,但是我在Maven Assembly插件的assembly.xml中使用了
一个哈克的方式要完成这个工作就是在project-child中指定依赖项,但是在'test'范围内(或任何最轻量级的可用范围)。这将“隐藏”project-parent中指定的作用域,以便它仅在测试代码时可用,在编译和运行时都不可用于非测试代码。
我偶然发现了这个bug功能。就我而言,我的项目子项目具有“编译”范围依赖关系的项目兄弟,而项目父项具有与“提供”范围指定的相同的依赖关系(实际上是从祖父母继承的)。 project-child是一个可执行文件,但是依赖于项目兄弟,因此在运行时从project-sibling引发了NoClassDefFoundError,因为正在使用project-child的运行时类路径,它不包括“提供的”依赖项。我通过将'compile'依赖从project-sibling移动到project-parent来解决这个问题,这样'compile'将“隐藏”'provided'。
我遇到了和你一样的问题。 在我的项目中,让我们称父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>
然后再次运行该命令以检查依赖关系列表。好!明确〜
希望可以帮助您:>
一个侧面说明:有人在做类似的事情,并提供了这样那样的“空”神器公共仓库(http://version99.qos.ch/) 。他们使用'99-empty'作为版本。人们认为我提出的方法可能会将此用作惯例。 –