maven依赖插件忽略依赖版本? [复制]

2024-05-02

在我看来,maven 依赖插件在计算依赖列表时行为不当。

假设这 3 个项目:

base1:

<?xml version="1.0" encoding="UTF-8"?>                                                                                                                            
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>mygroup</groupId>
    <artifactId>base1</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies>
      <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.3</version>
      </dependency>
    </dependencies>
</project>

base2:

<?xml version="1.0" encoding="UTF-8"?>                                                                                                                            
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>mygroup</groupId>
    <artifactId>base2</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies>
      <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.6</version>
      </dependency>
    </dependencies>
</project>

合并:

<?xml version="1.0" encoding="UTF-8"?>                                                                                                                            
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>mygroup</groupId>
    <artifactId>combined</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies>
      <dependency>
        <groupId>mygroup</groupId>
        <artifactId>base1</artifactId>
        <version>1.0-SNAPSHOT</version>
      </dependency>
      <dependency>
        <groupId>mygroup</groupId>
        <artifactId>base2</artifactId>
        <version>1.0-SNAPSHOT</version>
      </dependency>
    </dependencies>
</project>

base1 和 base2 都依赖于 commons-lang,但每个版本都不同! 组合取决于 base1 和 base2。

打电话时mvn dependency:list结合起来,我希望在 2.3 和 2.6 版本中看到 base1、base2 和 commons-lang,因为两者都被使用。 然而实际输出是:

[INFO] The following files have been resolved:
[INFO]    commons-lang:commons-lang:jar:2.3:compile
[INFO]    mygroup:base1:jar:1.0-SNAPSHOT:compile
[INFO]    mygroup:base2:jar:1.0-SNAPSHOT:compile

它甚至不使用版本号最高的 common-lang,而只是使用它第一个找到的那个。

我怎样才能避免这种情况?我需要所有依赖项。


根据这个官方文档 https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html(相关部分以粗体突出显示):

依赖性调解- 这决定了当遇到工件的多个版本时将使用哪个版本的依赖项。目前,Maven 2.0 仅支持使用“最近的定义”,这意味着它将使用依赖项树中与您的项目最接近的依赖项的版本。您始终可以通过在项目的 POM 中显式声明来保证版本。请注意,如果两个依赖项版本在依赖项树中处于相同深度,则在 Maven 2.0.8 之前,尚未定义哪个版本将获胜,但自 Maven 2.0.9 起,重要的是声明中的顺序:第一个声明获胜。

因此,Maven 选择 2.3 版本,因为它是在依赖解析过程中首先遇到的。请注意,如果您运行mvn dependency:tree on the combined模块,它将显示使用了哪个版本以及省略了哪个版本。

最好的解决方案是在中明确选择您想要的版本combined工件,通过在其 POM 中声明依赖关系,以便 Maven 比其他版本更青睐它:

<?xml version="1.0" encoding="UTF-8"?>
<project>
   <modelVersion>4.0.0</modelVersion>
   <groupId>mygroup</groupId>
   <artifactId>combined</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>jar</packaging>

   <dependencies>
     <dependency>
       <groupId>mygroup</groupId>
       <artifactId>base1</artifactId>
       <version>1.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>mygroup</groupId>
       <artifactId>base2</artifactId>
       <version>1.0-SNAPSHOT</version>
     </dependency>
     <dependency>    <!-- This will override the versions in base1 and base2 -->
       <groupId>commons-lang</groupId>
       <artifactId>commons-lang</artifactId>
       <version>2.6</version>
     </dependency>
   </dependencies>

请注意,Maven 无法选择两个版本,因为在这种情况下,项目的类路径上的相同类将有两个定义,这可能会导致运行时出现意外问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

maven依赖插件忽略依赖版本? [复制] 的相关文章

随机推荐