排除单个依赖项的所有传递依赖项

时间:2009-02-13 21:40:45

标签: maven-2 dependencies

在Maven2中,为了排除单个传递依赖,我必须做这样的事情:

<dependency>
  <groupId>sample.group</groupId>
  <artifactId>sample-artifactB</artifactId>
  <version>1</version>
   <exclusions>
     <exclusion>
       <groupId>sample.group</groupId>
       <artifactId>sample-artifactAB</artifactId>
     </exclusion>
   </exclusions>
</dependency>

这种方法的问题在于我必须为sample-artifactB贡献的每个传递依赖执行此操作。

有没有办法使用某种通配符一次排除所有传递依赖,而不是一个一个?

13 个答案:

答案 0 :(得分:270)

对我有用的东西(可能是Maven的新功能)仅仅是在排除元素中使用通配符。

我有一个多模块项目,其中包含一个“app”模块,该模块在两个WAR打包的模块中引用。其中一个WAR打包的模块实际上只需要域类(我还没有将它们从app模块中分离出来)。我发现这个工作:

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>app</artifactId>
    <version>${project.version}</version>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

groupId和artifactId上的通配符排除了通常使用此依赖关系传播到模块的所有依赖项。

答案 1 :(得分:48)

对于maven2,没有办法做你所描述的。对于maven 3,有。如果您使用的是maven 3,请参阅another answer for this question

对于maven 2,我建议为具有&lt; exclusions&gt;的依赖项创建自己的自定义pom。对于需要使用该依赖项的项目,请将依赖项设置为自定义pom而不是典型工件。虽然这不一定允许您使用单个&lt; exclusion&gt;排除所有传递依赖项,但它确实允许您只需编写一次依赖项,并且所有项目都不需要维护不必要的长排除列表。

答案 2 :(得分:30)

我觉得有用的一件事:

如果将依赖项与依赖项放在项目的父POM的dependencyManagement部分中,或者在可导入的依赖项管理POM中,那么您不需要重复排除(或版本)。

例如,如果您的父POM有:

<dependencyManagement>
    <dependencies>
    ...         
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.2.1</version>
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
     ....
  </dependencies>
</dependencyManagement>

然后项目中的模块可以简单地将依赖声明为:

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
        </dependency>

父POM中将指定版本和排除项。我几乎在所有项目中使用这种技术,它消除了很多重复。

答案 3 :(得分:22)

Three years ago我建议使用版本99不存在,但现在我想出了一个更好的方法,特别是因为版本99离线:

在项目的父POM中,如果不需要的依赖项爬进构建中,请使用maven-enforcer-plugin使构建失败。这可以使用插件的banned dependencies规则来完成:

<plugin>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.0.1</version>
    <executions>
        <execution>
            <id>only-junit-dep-is-used</id>
            <goals>
                <goal>enforce</goal>
            </goals>
            <configuration>
                <rules>
                    <bannedDependencies>
                        <excludes>
                            <exclude>junit:junit</exclude>
                        </excludes>
                    </bannedDependencies>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

然后,当它提醒您有关不受欢迎的依赖项时,请将其排除在父POM的<dependencyManagement>部分中:

<dependency>
    <groupId>org.springframework.batch</groupId>
    <artifactId>spring-batch-test</artifactId>
    <version>2.1.8.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </exclusion>
    </exclusions>
</dependency>

这样就不会意外地显示不需要的依赖项(不像只容易忘记的<exclusion>),即使在编译期间它也不可用(与provided范围不同),没有虚假的依赖(与版本99不同),它没有自定义存储库(与版本99不同)。这种方法甚至可以基于工件的版本,分类器,范围或整个groupId - see the documentation来处理细节。

答案 4 :(得分:10)

我使用以下解决方法:不是尝试在所有适当的依赖项中排除工件,而是将依赖项绘制为顶层的“提供”。 例如,为了避免运送xml-apis“无论什么版本”:

    <dependency>
        <groupId>xml-apis</groupId>
        <artifactId>xml-apis</artifactId>
        <version>[1.0,]</version>
        <scope>provided</scope>
    </dependency>

答案 5 :(得分:9)

目前,无法一次排除多个传递依赖项,但Maven JIRA网站上有一项功能请求:

https://issues.apache.org/jira/browse/MNG-2315

答案 6 :(得分:6)

有一种解决方法,如果将依赖关系的范围设置为运行时,将排除传递依赖关系。虽然要注意这意味着如果要打包运行时依赖项,则需要添加其他处理。

要在任何打包中包含运行时依赖项,您可以使用maven-dependency-plugin的copy goal for a specific artifact

答案 7 :(得分:6)

如果您需要从将要包含在程序集中的依赖项工件中排除所有传递依赖项,则可以在程序集插件的描述符中指定它:

<assembly>
    <id>myApp</id>
    <formats>
        <format>zip</format>
    </formats>
    <dependencySets>
        <dependencySet>
            <useTransitiveDependencies>false</useTransitiveDependencies>
            <includes><include>*:struts2-spring-plugin:jar:2.1.6</include></includes>
        </dependencySet>
    </dependencySets>
</assembly>

答案 8 :(得分:3)

您排除所有传递依赖项的原因是什么?

如果存在需要从每个依赖项中排除的特定工件(例如,commons-logging),Version 99 Does Not Exist方法可能会有所帮助。


2012年更新:请勿使用此方法。使用maven-enforcer-plugin and exclusions。版本99产生虚假依赖,版本99存储库处于脱机状态(有similar mirrors但您不能依赖它们永远保持在线;最好只使用Maven Central。

答案 9 :(得分:3)

如果您在Eclipse下开发,则可以在POM编辑器(已启用高级选项卡)依赖关系图中查找要排除项目的依赖项,然后:

右键单击它 - &gt; “排除Maven工件......”Eclipse将为您排除,而无需了解lib链接的依赖关系。

答案 10 :(得分:1)

在一个类似的问题中,我在提供范围时声明了所需的依赖关系。 使用这种方法,可以获取传递依赖项,但不包含在包阶段中,这是您想要的。 我在维护方面也喜欢这个解决方案,因为没有pom,或像whaley解决方案那样的定制pom,需要维护;您只需要在容器中提供特定的依赖关系并完成

答案 11 :(得分:-1)

在类路径中使用最新的maven ..它将删除重复的工件并保留最新的maven工件..

答案 12 :(得分:-3)

您可以使用排除,但您必须手动列出要排除的每个依赖项...

<dependency>
  <groupId>sample.group</groupId>
  <artifactId>sample-artifactB</artifactId>
  <version>1</version>
   <exclusions>
     <exclusion>
       <groupId>sample.group</groupId>
       <artifactId>sample-artifactAB</artifactId>
     </exclusion>
   </exclusions>
</dependency>