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

时间:2011-01-17 18:09:05

标签: maven maven-2 dependencies pom.xml

我正在尝试找到一种“通用”方法,将传递依赖项排除在外,而不必将其从依赖于它的所有依赖项中排除。例如,如果我想要排除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文件,部分原因是为了避免将来添加依赖于排除依赖项的依赖项的问题 - 并且忘记排除它。

有办法吗?

4 个答案:

答案 0 :(得分:55)

这有帮助吗? 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中声明这一点。“

答案 1 :(得分:16)

我创建了一个空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。但这只是化妆品。

答案 2 :(得分:9)

展开dnault's comment

可以使用Maven Enforcer plugin's Banned Dependencies rule来确保排除依赖关系。仍然必须手动排除它们,但如果有人错误地将依赖项添加到其他地方,则构建将失败。

<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 Global dependency exclusions

答案 3 :(得分:4)

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

  

为什么要在每个依赖项基础上进行排除,而不是在POM级别进行排除

     

这主要是为了确保依赖图是可预测的,并通过排除不应排除的依赖项来保持继承效果。如果你采用最后的方法并且必须进行排除,那么你应该绝对确定哪些依赖项会带来不必要的传递依赖。

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

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

任何slf4j-api版本&gt; = 1.4.2都将被视为在运行时提供(提供),来自已配置的类路径或容器。

<强>参考