首页 > 解决方案 > Maven对系统范围依赖的传递依赖

问题描述

我有一个 spring boot 项目(2.1.3),我必须在其中添加一个由我们的合作伙伴之一提供的 jar 文件(使用com.aesencgroup id 引用)。我将它添加为系统范围的依赖项,即使它违反了建议,因为这个 repo 已经有其他系统范围的依赖项(将来会解决这个问题)。由于合作伙伴提供的 jar ( commons-codec) 中的传递依赖关系,这破坏了其中一个 API 调用。Spring Boot 开始使用它commons-codec,而不是 spring bom 附带的那个。为了解决这个问题,我向系统范围的依赖项添加了排除项

<dependency>
   <groupId>aesenc.group</groupId>
   <artifactId>com.aesenc</artifactId>
   <version>1.0</version>
   <scope>system</scope>
   <exclusions>
      <exclusion>  <!-- declare the exclusion here -->
         <groupId>commons-codec</groupId>
         <artifactId>commons-codec</artifactId>
      </exclusion>
   </exclusions>
   <systemPath>${basedir}/src/main/resources/libs/AESEnc/AESEnc.jar</systemPath>
</dependency>

这并没有解决问题。因此,在浏览了 maven 文档后,我commons-codec在当前项目中添加了更新版本作为依赖项,使其成为依赖关系图中的直接子项

<dependency>
   <groupId>commons-codec</groupId>
   <artifactId>commons-codec</artifactId>
   <version>1.15</version>
</dependency>

仅此一项也没有解决问题。但是通过将它移到com.aesencpom 文件中的上方,问题得到了解决。所以我对我对 Maven 中依赖解析是如何发生的理解感到困惑。

This didn't work:

My project +
           |
           +-aesenc-+
           |        |
           |        +commons-codec-v1.10
           |
           +commons-codec-v1.15

我的假设是,这就是依赖树的样子,只需将 v1.15 添加为依赖项就可以解决问题,而不管它在 pom.xml 中的顺序如何。

This worked:

My project +
           |
           +commons-codec-v1.15
           |
           +-aesenc-+
                    |
                    +commons-codec-v1.10

想知道我的假设哪里出错了。

标签: spring-bootmavenapache-commons-codec

解决方案


推荐阅读