记一次Maven版本被覆盖的实例
出于项目需要,引入了一个高版本的Jar包:
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.21.0</version>
</dependency>
但是,发现引入的jar包一部分是其他版本的,但是pom.xml文件只有这一个依赖引入相关Jar包。
推测是Maven版本号被覆盖了,因为项目中引入了父依赖:
<parent>
<groupId>org.XXX</groupId>
<artifactId>XXX-parent</artifactId>
<version>1.11.1.RELEASE</version>
</parent>
跟进去之后果然找到了原因:
<dependencyManagement>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.15.23</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencyManagement>
这里可以看到,父依赖没有直接引入相关依赖,而是限制了相关依赖的版本。
Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式。在dependencyManagement元素中声明所依赖的jar包的版本号等信息,那么所有子项目再次引入此依赖jar包时则无需显式的列出版本号。Maven会沿着父子层级向上寻找拥有dependencyManagement 元素的项目,然后使用它指定的版本号。
跟进去software.amazon.awssdk.bom可以看到,有些Jar包正好是版本被覆盖的对象:
解决方法很简单:和父依赖的版本保持一致即可,毕竟是父依赖推荐的版本。
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.15.23</version>
</dependency>