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版本。

image.png

也就是说:依据最近优先的原则,即使在组件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>
上一篇下一篇

猜你喜欢

热点阅读