7

例如,如果存在依赖项:

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

3 回答 3

14

用于mvn dependency:analyze向您显示您的 pom 中是否存在您不需要的依赖项(它也可能会识别您错过的一些依赖项,添加-DoutputXML=true以显示丢失的条目)。

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

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

编辑:好的,你更新了你的问题。这是您的操作方法:

  1. 在项目中a,运行mvn dependency:tree -Dverbose=true。这将向您显示 Maven 为您的项目考虑的所有依赖项的完整树。
  2. 查看第 1 步的输出,并列出所有显示在超过一层深度的依赖项(其中一些可能是重复的)。
  3. 在您喜欢的任何编辑器中编辑您的 pom.xml 文件,并删除与您在步骤 2 中创建的列表匹配的所有依赖项。

或者您是否正在寻找一种自动执行此操作的方法?我不认为有任何自动化的方式,除非你自己写一个,因为你想做的是一个BAD IDEA。您是在告诉人们他们的反对意见与您的问题“无关”,但事实是您的问题就像是在问“我怎样才能使用 Maven 使使用 Maven 变得更加困难?”

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

于 2010-10-01T08:45:43.473 回答
13

我假设您想找到已经满足的虚假/不必要的依赖项,因为您可以从另一个依赖项中免费获得它们。

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

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

您永远不知道将来模块是否会作为依赖b项删除c并因此中断a

于 2010-10-01T22:43:55.193 回答
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>
于 2010-10-01T08:06:25.667 回答