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

时间:2010-09-30 09:49:29

标签: maven-2 dependencies dependency-management

例如,如果存在依赖关系:

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>

3 个答案:

答案 0 :(得分:14)

使用mvn dependency:analyze向您显示您的pom中是否存在您不需要的依赖项(它可能还会识别您错过的一些项,添加-DoutputXML=true以显示缺少的项目。)< / p>

使用mvn dependency:tree向您展示项目当前正在使用的依赖项以及Maven在哪里找到它们。添加-Dverbose=true以显示所有重复项和冲突。

如果a 直接取决于c(即a中的代码提及c中的类),那么pom应该反映出来它。如果a仅直接依赖于b,那么您可以安全地从c的pom.xml文件中删除a依赖项。上面的命令可以让您确定适当的下一步操作。

修改:好的,您更新了问题。这是你如何做到的:

    在项目a
  1. ,运行mvn dependency:tree -Dverbose=true。这将显示Maven为您的项目考虑的所有依赖项的完整树。
  2. 查看步骤1的输出,并列出深度超过一级的所有依赖项(其中一些可能是重复的)。
  3. 在您喜欢的任何编辑器中编辑您的pom.xml文件,并删除与您在步骤2中创建的列表匹配的所有依赖项。
  4. 或者您正在寻找自动执行此操作的方法吗?除非你自己写一个,否则我认为没有任何自动化方式,因为你要做的是 BAD IDEA 。你告诉别人他们的反对意见与你的问题“无关”,但事实是你的问题就像问“我如何使用Maven使使用Maven更难?”

    没有充分理由要你这样做。如果您认为有充分的理由,那么您必须尝试这样做以产生一些结果。你应该寻求所需结果的帮助,因为你的计划很糟糕。

答案 1 :(得分:12)

我认为您希望找到已经满足的虚假/不必要的依赖项,因为您可以从其他依赖项中免费获取它们。

我可以想象你可能想要这样做以清理你的poms。

但是,这通常不是您想要做的事情,因为明确说明您的依赖关系是一种很好的做法。

您永远不知道将来模块b是否将c删除为依赖关系,从而打破a

答案 2 :(得分: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>