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:如果它们已经是可传递的,如何删除它们?的主要内容,如果未能解决你的问题,请参考以下文章

GET和POST可传递的值到底有多大

GET和POST可传递的值到底有多大?

如果它们是奇怪的,如何删除重复的行,否则保留一个

Maven:我应该保留还是删除声明的依赖关系,它们也是传递依赖关系?

常春藤:我如何删除传递依赖?

Prolog:获取包含给定整数的子列表