考虑以下Java 库的项目 POM:
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>foo</groupId>
<artifactId>lib</artifactId>
<version>1</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
</dependencies>
</project>
如愿以偿,该项目依赖于 commons-codec 版本 1.10:
$ mvn dependency:list | grep commons-codec
[INFO] commons-codec:commons-codec:jar:1.10:compile
但是,如果将此库用作下游项目中的依赖项,则可传递继承的 commons-codec 版本将为 1.9,因为org.apache.httpcomponents:httpclient:4.5.3
依赖于 1.9,而不是 1.10。
下面是说明该问题的应用程序 POM:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>foo</groupId>
<artifactId>app</artifactId>
<version>1</version>
<dependencies>
<dependency>
<groupId>foo</groupId>
<artifactId>lib</artifactId>
<version>1</version>
</dependency>
</dependencies>
</project>
以及已解决的依赖项:
mvn dependency:list | grep commons-codec
[INFO] commons-codec:commons-codec:jar:1.9:compile
这是 Maven 中的错误吗?还是预期的行为?
如果是有意的,有没有办法(无需在任一 POM 中硬编码传递依赖项(来继承在库组件构建期间解析的版本?
一种解决方案是继承库的依赖管理,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>foo</groupId>
<artifactId>app</artifactId>
<version>1</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>foo</groupId>
<artifactId>lib</artifactId>
<version>1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>foo</groupId>
<artifactId>lib</artifactId>
<version>1</version>
</dependency>
</dependencies>
</project>
然后它起作用:
mvn dependency:list | grep commons-codec
[INFO] commons-codec:commons-codec:jar:1.10:compile
但这是最好/唯一的解决方案吗?如果必须始终对每个依赖项执行此操作以确保传递版本实际匹配,这似乎是不幸/无意的。
我也发布了这段代码作为要点。