gpt4 book ai didi

maven - 我如何依赖具有传递依赖项的库,这些依赖项由 Maven 依赖项管理调整,并且版本与调整后的版本相同?

转载 作者:行者123 更新时间:2023-12-05 07:41:51 24 4
gpt4 key购买 nike

考虑以下 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

但这是最好/唯一的解决方案吗?如果必须始终对每个依赖项执行此操作以确保传递版本实际匹配,这似乎是不幸的/意外的。

我也发布了这段代码 as a gist .

关于maven - 我如何依赖具有传递依赖项的库,这些依赖项由 Maven 依赖项管理调整,并且版本与调整后的版本相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45041888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com