maven—打包的jar引用到项目中后,jar中显示声明的版本号
2021-06-01 本文已影响0人
小胖学编程
项目起因—>为项目提供了一个技术组件jar包,组件jar包中使用了
groovy 3.0.6
版本的依赖,将组件jar引入项目后(SpringBoot2.0.4)版本,但是启动项目后抛出异常。
Caused by: java.lang.ClassNotFoundException: org.apache.groovy.util.concurrent.concurrentlinkedhashmap.ConcurrentLinkedHashMap$Builder
at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[?:1.8.0_241]
at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[?:1.8.0_241]
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) ~[?:1.8.0_241]
at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[?:1.8.0_241]
但组件jar明明使用的是groovy 3.0.6
版本的依赖,为什么会缺少包呢?查看项目的groovy依赖,发现引入的版本是groovy 2.4.15
。
经过排查,发现项目引入组件的pom配置中:
image.png点击向上箭头:
image.png发现其引用的version为spring-boot-dependencise
中定义的2.4.15版本。
也就是说:依据最近优先的原则,即使在组件jar中定义了版本号,但是SpringBoot的pom文件中声明了dependencyManagement标签中存在该依赖的版本,则优先使用SpringBoot的pom文件。
覆盖的优先级:项目子pom
>项目父pom
>SpringBoot父pom
>组件的pom文件
。
解决方案
在项目父pom文件中定义dependencyManagement标签,来覆盖pringBoot父pom的配置。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>3.0.6</version>
</dependency>
</dependencies>
</dependencyManagement>