Maven: 如果依赖已经是传递性的,如何删除它们?

8
例如,如果存在依赖关系:
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>

2
如果 b 发生变化不再依赖 c,那么您的构建就会失败。为什么要隐藏这种依赖关系,如果它实际上存在呢? - Thomas Lötzer
@Thomas 这与这个问题无关。 - Lenik
3个回答

15
使用 mvn dependency:analyze 命令可以告诉您是否存在不需要的依赖项,也可能会标识出您遗漏的某些依赖项。添加 -DoutputXML=true 参数可显示缺少的条目。
使用 mvn dependency:tree 命令可以显示项目当前正在使用的依赖项以及Maven在哪里找到它们。 添加 -Dverbose=true 参数可显示所有重复和冲突的依赖项。
如果 a 直接依赖于 c(即 a 中的代码提及了 c 中的类),则 POM 应该反映这一点。 如果 a 仅直接依赖于 b,则可以安全地从 a 的 pom.xml 文件中删除 c 依赖项。 上述命令应该让您确定适当的下一步操作。
编辑您喜欢的任何编辑器中的 pom.xml 文件,并删除与步骤2中创建的列表匹配的依赖项。
如果您正在寻找自动执行此操作的方式,则我认为除非您自己编写,否则没有任何自动化方法,因为您正在尝试做的是一个 不好的主意。 您正在告诉人们他们的反对意见“与问题无关”,但事实是您的问题就像在问“如何使用Maven使使用Maven更加困难?”。

没有充分的理由来做这件事情。如果你认为有好的理由,那么你一定是在尝试着通过这种方式来实现某些结果。你应该寻求帮助以达成期望的结果,因为你的计划是不可取的。


请注意,在运行“dependency:analyze”之前应该先运行“mvn install”,因为分析是在已编译的构件上进行的。 - Zac Thompson

14

我想你想要找到那些不必要的依赖项,因为你从另一个依赖项中获取了它们,已经被满足了。

我可以想象你可能想这样做是为了清理您的pom文件。

然而,通常情况下,这不是您想要做的事情,因为明确声明您的依赖关系是一个好的实践。

你永远不知道未来的模块b是否会删除c作为依赖项,从而破坏a


你说得对。我必须清理pom文件,因为程序员不太熟悉Maven工具和软件工程,所以依赖关系没有很好地声明。这些依赖关系大多由IDE管理。生成一个最小化的依赖图也是有价值的,可以用于说明目的。 - Lenik

2

和其他回答者一样,我不太确定你想要实现什么目标。也许排除是你需要的?你可以使用排除来删除依赖项的依赖关系-如果由于某些原因它们不需要。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接