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

在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提供的每个传递依赖项执行此操作。

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

对于maven2,没有办法做你所描述的。 对于maven 3,有。 如果你正在使用maven 3,请参阅这个问题的另一个答案

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

什么对我有效(可能是Maven的一个新特性)仅仅是在排除元素中使用通配符。

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

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

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

有一件事我觉得有用:

如果将依赖项与排除项放在项目的父POM的dependencyManagement部分中,或放入可导入的依赖项pipe理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中将指定版本和排除。 几乎我们所有的项目都使用这种技术,消除了很多重复。

三年前我推荐使用版本99不存在,但是现在我已经find了一个更好的方法,特别是从版本99离线:

在项目的父POM中,如果不需要的依赖关系渗透到构build中,则使用maven-enforcer-plugin来使构build失败。 这可以使用插件的禁止依赖规则来完成:

 <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 – 请参阅文档以获取详细信息。

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

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

我使用下面的解决方法:而不是试图排除在所有适当的依赖关系中的工件,我把依赖作为“提供”在顶层。 例如,为了避免运送xml-apis“任何版本”:

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

有一个解决方法,如果你设置一个依赖的范围到运行时 ,传递的依赖将被排除在外。 虽然请注意,这意味着如果要打包运行时依赖项,则需要添加额外的处理。

要在任何包装中包含运行时依赖项,您可以使用maven-dependency-plugin的复制目标来处理特定的工件 。

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

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

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

右键点击它 – >“排除Maven Artifact …”,Eclipse将排除你,而不需要找出链接的依赖关系。

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

如果您需要从每个依赖项中排除特定工件(如commons-logging),则“ 版本99不存在”方法可能会有所帮助。


2012年更新:不要使用这种方法。 使用maven-enforcer插件和排除 。 版本99会产生伪造的依赖关系,而版本99的存储库是脱机的(也有类似的镜像,但不能依靠它们永远保持在线;最好只使用Maven Central)。

在一个类似的问题,我有所需的依赖声明与范围提供。 使用这种方法,传递依赖被提取,但不包含在包阶段,这是你想要的。 我也喜欢这个维护方面的解决scheme,因为在whaley的解决scheme中没有pom或者自定义的pom需要维护; 你只需要在容器中提供特定的依赖关系并完成

在你的classpath中使用最新的maven。它将删除重复的工件,并保持最新的maven工件。

您可以使用排除,但是您必须手动列出您希望排除的每个依赖关系…

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