Maven:如果它们已经是可传递的,如何删除它们?
Posted
技术标签:
【中文标题】Maven:如果它们已经是可传递的,如何删除它们?【英文标题】:Maven: How to remove dependencies if they are already transitive? 【发布时间】:2011-04-19 06:32:05 【问题描述】:例如,如果有依赖关系:
a -> b
a -> c
b -> c
我想删除依赖a -> c
,因为有a -> b -> c
。
我知道可能有一些不应该减少的强依赖关系,但这与这个问题无关。
例子:
In a.pom:
<dependencies>
<dependency>b</dependency>
<dependency>c</dependency>
</dependencies>
In b.pom:
<dependencies>
<dependency>c</dependency>
</dependencies>
预期结果:
In a.pom:
<dependencies>
<dependency>b</dependency>
</dependencies>
【问题讨论】:
然后,如果 b 发生变化并且不再依赖于 c,您的构建就会中断。如果确实存在,为什么要隐藏该依赖项? @Thomas 这与这个问题无关。 【参考方案1】:使用mvn dependency:analyze
向您显示您的 pom 中是否存在您不需要的依赖项(它也可能会识别您错过的一些依赖项,添加 -DoutputXML=true
以显示丢失的条目)。
使用mvn dependency:tree
向您显示项目当前使用的依赖项以及 Maven 在哪里找到它们。添加-Dverbose=true
以显示所有重复和冲突。
如果a
直接 依赖于c
(即如果a
中的代码提到c
中的类),那么pom 应该反映它。如果a
仅直接依赖于b
,那么您可以安全地从a
的pom.xml 文件中删除c
依赖项。上面的命令应该使您能够确定什么是适当的下一步操作。
编辑:好的,你更新了你的问题。以下是你的做法:
-
在项目
a
中,运行mvn dependency:tree -Dverbose=true
。这将向您显示 Maven 为您的项目考虑的所有依赖项的完整树。
查看第 1 步的输出,并列出所有显示在不止一层深度的依赖项(其中一些可能是重复的)。
在您喜欢的任何编辑器中编辑您的 pom.xml 文件,并删除与您在第 2 步中创建的列表匹配的所有依赖项。
或者您是否正在寻找一种自动执行此操作的方法?我不认为有任何自动化的方法,除非你自己写一个,因为你试图做的是一个BAD IDEA。您是在告诉人们他们的反对意见与您的问题“无关”,但事实是您的问题就像是在问“我如何使用 Maven 使使用 Maven 变得更加困难?”
您没有充分的理由要这样做。如果您认为有充分的理由,那么您必须尝试这样做以产生一些结果。你应该寻求帮助以获得预期的结果,因为你的计划很糟糕。
【讨论】:
请注意,您应该在dependency:analyze
之前运行mvn install
,因为分析是在编译后的工件上完成的【参考方案2】:
我假设您想找到已经满足的虚假/不必要的依赖项,因为您可以从另一个依赖项中免费获得它们。
我可以想象你可能想要这样做以清理你的 pom。
但是,这通常不是您想要做的事情,因为明确说明您的依赖项是一种很好的做法。
你永远不知道在未来的模块 b
是否会删除 c
作为依赖项,从而破坏 a
【讨论】:
你是对的。我必须清理 pom,因为程序员对 Maven 工具和软件工程不是很熟悉,所以依赖关系没有很好地声明。依赖项主要由 IDE 管理。为说明目的生成最小化的依赖图也很有价值。【参考方案3】:与其他海报一样,我不确定您想要实现什么。可能是您需要的排除项?您可以使用排除项来删除依赖项的依赖项 - 如果由于某些原因不需要它们。
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>logkit</groupId>
<artifactId>logkit</artifactId>
</exclusion>
<exclusion>
<groupId>avalon-framework</groupId>
<artifactId>avalon-framework</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
【讨论】:
以上是关于Maven:如果它们已经是可传递的,如何删除它们?的主要内容,如果未能解决你的问题,请参考以下文章