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

这是我的一般问题:

我的项目P取决于A取决于B取决于C取决于D的版本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)”replacestax-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> 

你在根pom的</dependencies>标记里放入的东西将被所有的根pom的子模块包含。 如果你所有的模块都使用这种依赖关系,那么这是一条路。

但是,如果您的子模块中只有三个使用了某种依赖关系,则不需要将这个依赖关系包含在所有的子模块中。 在这种情况下,您可以将依赖关系放在</dependencyManagement> 。 这将确保任何需要依赖关系的子模块都必须在自己的pom文件中声明它,但是它们将使用与</dependencyManagement>标记中指定的相同版本的依赖</dependencyManagement>

您还可以使用</dependencyManagement>修改传递依赖中使用的版本,因为在最上面的pom文件中声明的版本是将要使用的版本。 如果您的项目A包含一个包含另一个外部项目C v1.0的外部项目B v1.0,这可能很有用。 有时候会发生在C v1.0中的安全漏洞,这个漏洞在V1.1中得到纠正,但是B的开发者更新他们的项目使用C的V1.1很慢。在这种情况下,你可以直接声明在你的项目的根目录下,依赖C v1.1,一切都会好(假设B v1.0仍然能够用C v1.1编译)。