Maven:如何覆盖由库添加的依赖项

这是我的一般问题:

我的项目P取决于A取决于B取决于B取决于C的版本1.0.1。

D版本1.0.1存在问题,我想强制使用另一个模块。 我不知道如何在我的项目的POM中声明这个,因为我没有直接添加对D的依赖。 这是C宣布对D的依赖。

重要提示:在这种情况下,不仅版本发生更改,而且组和工件也会更改。 所以这不仅仅是重写依赖版本的问题,而是排除一个模块并包含另一个模块。

在具体的情况下,D是StAX,其1.0.1有一个bug。 根据bug中的注释,“通过stax-api-1.0-2(maven GroupId = javax.xml.stream)替换stax-api-1.0.1(maven GroupId = stax)”解决了问题,所以我我正在努力。

因此,D = stax:stax-api:jar:1.0.1和C = org.apache.xmlbeans:xmlbeans:jar:2.3.0

我使用maven 2.0.9以防万一。

mvn依赖项的输出:树“

mvn dependency:tree
[..snip..]
[INFO] +- org.apache.poi:poi-ooxml:jar:3.6:compile
[INFO] |  +- org.apache.poi:poi-ooxml-schemas:jar:3.6:compile
[INFO] |  |  +- org.apache.xmlbeans:xmlbeans:jar:2.3.0:compile
[INFO] |  |  |  - stax:stax-api:jar:1.0.1:compile

在我的项目的POM中,我对“A”具有以下依赖关系:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.6</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.6</version>
</dependency>

提前致谢。


只需在您当前的pom中指定版本。 此处指定的版本将覆盖其他版本。

强制版本
如果一个版本在当前的POM中使用特定的版本进行声明,那么它将永远得到尊重 - 但是,应该注意的是,如果它本身依赖于传递依赖关系,它也会影响其他poms下游。


资源:

  • 依赖性调解和冲突解决
  • 介绍依赖机制

  • 或者,您可以排除您不需要的依赖关系。 STAX包含在JDK 1.6中,所以如果你使用1.6,你可以完全排除它。

    我下面的例子对你来说有点不对劲 - 你只需要两个排除中的一个,但我不太确定哪一个。 还有其他版本的Stax是浮动的,在我的下面的示例中,我导入了导入B的B导入了C&D,每个导入都通过更传递的依赖项导入不同版本的Stax。 因此,在对'A'的依赖中,我排除了两个版本的Stax。

    <dependency>
      <groupId>a.group</groupId>
      <artifactId>a.artifact</artifactId>
      <version>a.version</version>
      <exclusions>
        <!--  STAX comes with Java 1.6 -->
        <exclusion>
          <artifactId>stax-api</artifactId>
          <groupId>javax.xml.stream</groupId>
        </exclusion>
        <exclusion>
          <artifactId>stax-api</artifactId>
          <groupId>stax</groupId>
        </exclusion>
      </exclusions>
    <dependency>
    

    我在第三方库中也无法取代依赖关系。 我用排除了scot的方法,但我也在pom中添加了更新版本的依赖项。 (我用Maven 3.3.3)

    因此,对于stAX示例,它看起来像这样:

    <dependency>
      <groupId>a.group</groupId>
      <artifactId>a.artifact</artifactId>
      <version>a.version</version>
      <exclusions>
        <!--  STAX comes with Java 1.6 -->
        <exclusion>
          <artifactId>stax-api</artifactId>
          <groupId>javax.xml.stream</groupId>
        </exclusion>
        <exclusion>
          <artifactId>stax-api</artifactId>
          <groupId>stax</groupId>
        </exclusion>
      </exclusions>
    <dependency>
    
    <dependency>
        <groupId>javax.xml.stream</groupId>
        <artifactId>stax-api</artifactId>
        <version>1.0-2</version>
    </dependency>
    
    链接地址: http://www.djcxy.com/p/29701.html

    上一篇: Maven: how to override the dependency added by a library

    下一篇: Is there anyway to exclude artifacts inherited from a parent POM?