Is there a way to exclude a Maven dependency globally?

我试图找到一种“通用”的方法来排除传递依赖关系,而不必将它从所有依赖于它的依赖关系中排除。例如,如果我想排除 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>

This is partly to clean up the pom file, partly to avoid issues in the future with people adding dependencies that depend on that excluded dependency — and forgetting to exclude it.

有办法吗?

71332 次浏览

有帮助吗

“假设我想从我的 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 中声明它。”

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

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

它并不完美,因为从现在开始,在编译/测试路径中有一个空 jar。但这只是表面现象。

提醒一下,以下是来自 Maven 官方文档的答案:

为什么排除是在每个依赖关系的基础上,而不是在 POM 一级

这样做主要是为了确保依赖关系图是可预测的,并防止继承效应排除不应该被排除的依赖关系。如果你使用了最后一种方法并且不得不放入一个排除,你应该完全确定你的哪个依赖项带来了那个不想要的传递依赖项。

If one wants to make a build more robust, a 版本范围 can be used. This would ensure that no newer version of the dependency can interfere with the project.

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

任何 slf4j-api 版本 > = 1.4.2都将被认为是在运行时提供(提供)的,无论是从配置的类路径还是容器。

参考文献

Dnault 的评论上扩展:

可以使用 Maven Enforcer 插件的禁用依赖规则来确保排除依赖项。仍然需要手动排除它们,但是如果有人错误地在其他地方添加了依赖项,那么构建就会失败。

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

还有一个开放特性请求: MNG-1977年全球受扶养人排除