如何在Maven中从父项目中排除依赖项?

例如,我有2个Maven项目。 一个是“项目 – 父母”。 另一个是“项目孩子”。 显然,“项目 – 孩子”是“项目 – 父母”的子项目。

“project-parent”具有log4j的依赖关系。 但我想将它从“项目 – 孩子”中排除。 有办法吗?

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

提前致谢。

我认为在Maven2中没有办法实现这一点,因为这就是POMinheritance的用途。 但是我可以想到一个技巧:

假设您有权将工件上载到内部工件存储库。 您可以创建一个空JAR,将其部署为log4j:log4j,具有明显exception的版本(例如log4j:log4j:9999)。 在project-child中添加这样的依赖项。 然后它将覆盖parent的依赖关系取决于实际上为空的JAR。

我不知道实际排除依赖关系的方法,但您可以将其从目标分发中排除,但这有点像黑客攻击。 您需要将依赖项的范围更改为可以在最终分发中排除的内容。

所以,说我父母对junit 4.8的依赖,在我的pom中你说:

  junit junit 4.8 provided  

所以我们正在改变提供的范围。 有关其工作原理的说明,请参阅我在注释处理期间对NoClassDefFoundError:org / junit / AfterClass的回答。 不幸的是,这不会影响构建,但是当您复制最终分发的依赖项时,可以使用excludeScope配置元素不将依赖项复制到最终分发中:

  maven-dependency-plugin   copy-libs package  copy-dependencies   ${project.build.directory}/lib provided   

如果我理解了这个问题,你需要的是以下内容。 它引入了一个依赖项,并将该依赖项排除在添加到其依赖项列表之外。 如果要注入较新版本的软件包而不是其他软件包中引用的软件包,通常会使用此方法。

  log4j log4j 1.2.15   com.sun.jmx jmxri  ...  ... 

如果您正在谈论关系,那么我不确定是否有办法做到这一点。 你能从切换到吗?

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

   org.slf4j slf4j-api ${slf4j-api.version}   log4j log4j ${log4j.version}   org.slf4j jcl-over-slf4j ${slf4j-api.version}   org.slf4j slf4j-log4j12 ${slf4j-log4j12.version}  

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

所以。 我添加了父的依赖

  parent myartifactId ${my parent version}  

并使用排除项删除log4j

  parent myartifactId ${my parent version}   log4j log4j    

并在child pom中显式添加slf4j和log4j2的依赖项

   org.slf4j slf4j-api 1.7.6   org.apache.logging.log4j log4j-slf4j-impl 2.8.2   org.apache.logging.log4j log4j-api 2.8.2   org.apache.logging.log4j log4j-core 2.8.2   com.lmax disruptor 3.3.4  

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

好吧,让我们在那个依赖项上添加排除项……删除这个人。

   org.apache.kafka kafka-clients 0.10.1.1   log4j log4j    

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

希望能帮到你:>

实现此目的的一种hacky方法是在project-child中指定依赖项,但使用“test”范围(或任何最轻的范围可用)。 这将“隐藏”project-parent中指定的作用域,以便它仅可用于测试代码,并且在编译和运行时都不可用于非测试代码。

我大多是错误地遇到了这个错误的function。 就我而言,我的project-child有一个带有’compile’范围依赖关系的项目兄弟,而project-parent具有指定的相同依赖关系(实际上是从祖父母inheritance的)具有’提供’范围。 project-child是一个可执行文件但是依赖于project-sibling,因此在运行时从project-sibling抛出NoClassDefFoundError,因为正在使用project-child的运行时类路径,其中不包括“提供的”依赖项。 我通过将’compile’依赖项从project-sibling移动到project-parent来修复此问题,以便’compile’将“隐藏”’提供’。