有没有办法在全球范围内排除Maven依赖关系?

我试图find一个“通用”的方式排除一个传递依赖从被包含而不必排除它依赖于它的所有依赖。 例如,如果我想排除slf4j,我做了以下操作:

<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jmx</artifactId> <version>3.3.2.GA</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>3.4.0.GA</version> <type>jar</type> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> 

这部分是为了清理pom文件,部分是为了避免将来出现问题,人们添加依赖于排除依赖的依赖,而忘记排除依赖。

有没有办法?

这有帮助吗? http://jlorenzen.blogspot.com/2009/06/maven-global-excludes.html

“假设我想从我的WAR中排除avalon-framework,我会在提供的作用域中将以下内容添加到我的项目POM中,这适用于所有传递依赖关系,并允许您指定一次。

 <dependencies> <dependency> <artifactId>avalon-framework</artifactId> <groupId>avalon-framework</groupId> <version>4.1.3</version> <scope>provided</scope> </dependency> </dependencies> 

这甚至可以在父POM中指定它,这将防止项目必须在所有子POM中声明它。

我创build了一个空的jar并创build了这个依赖:

 <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <scope>system</scope> <systemPath>${basedir}/src/lib/empty.jar</systemPath> <version>0</version> </dependency> 

这是不完美的,因为从现在起,你的编译/testingpath中有一个空的jar。 但是,这只是美容。

提醒一下,这里是Maven官方文档的答案:

为什么排除在每个依赖的基础上,而不是在POM的水平

这主要是为了确保依赖关系图是可预测的,并保持inheritance效应不排除不应排除的依赖关系。 如果你采取最后的手段,必须排除,你应该绝对确定你的依赖关系是否带来了不必要的传递依赖。

如果想要使构build更健壮,可以使用版本范围 。 这将确保没有更新版本的依赖可以干扰项目。

 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>[1.4.2,)</version> <scope>provided</scope> </dependency> 

任何slf4j-api版本> = 1.4.2将被视为在运行时提供(提供),或者由JDK本身或容器。

参考

  • Maven版本范围
  • 可选的依赖和依赖排除

展开dnault的评论 :

可以使用Maven Enforcer插件的禁止依赖规则来确保排除依赖关系。 仍然需要手动排除它们,但是如果有人在别处添加了依赖关系,构build将会失败。

 <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jmx</artifactId> <version>3.3.2.GA</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <version>1.4.1</version> <executions> <execution> <goals> <goal>enforce</goal> </goals> <configuration> <rules> <bannedDependencies> <excludes> <exclude>org.slf4j:slf4j-api</exclude> </excludes> </bannedDependencies> </rules> </configuration> </execution> </executions> </plugin> </plugins> 

还有一个公开的function请求: MNG-1977全球依赖排除