java.lang.NoClassDefFoundError_ org_springframework_boot_bind_RelaxedPropertyResolver

异常问题:

先看问题,今天想把之前有druid的项目,拷贝到一个新项目中,但是莫名其妙的出现了这个问题,就很奇怪哦!

java.lang.NoClassDefFoundError: org/springframework/boot/bind/RelaxedPropertyResolver
	at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.getExcludeAutoConfigurationsProperty(AutoConfigurationImportSelector.java:205) ~[spring-boot-autoconfigure-1.5.22.RELEASE.jar:1.5.22.RELEASE]
	at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.getExclusions(AutoConfigurationImportSelector.java:199) ~[spring-boot-autoconfigure-1.5.22.RELEASE.jar:1.5.22.RELEASE]
	at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.selectImports(AutoConfigurationImportSelector.java:96) ~[spring-boot-autoconfigure-1.5.22.RELEASE.jar:1.5.22.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassParser$DefaultDeferredImportSelectorGroup.process(ConfigurationClassParser.java:888) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGrouping.getImports(ConfigurationClassParser.java:874) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]

047DF42F.gif

于是上网查了查,是依赖冲突了,网上大部分的解决方案都是继承一下父项目

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.1.7.RELEASE</version>
</parent>

没错,加上之后确实好用了。但是总感觉怪怪的,有两个问题哈。
04951572.gif

思考问题

  1. 为什么之前的项目启动没问题呢?
  2. 总感觉这种方式治标不治本,而且人家就不想继承怎么办嘞。

解决问题1

于是,带着问题开始查资料,无非就是依赖冲突嘛,解决就可以了呗。
首先,先找到冲突的依赖,怎么找呢,问题既是答案
image.png
很明显,这个jar包中没有这个类呗。
所以先找到这个jar包
image.png
一查就知道了,其实有两个这种jar包,两个版本不通而已,凭经验猜测,肯定是高版本的jar包有这个类呗(其实是去旧的项目中查了下,旧的项目中引入的只有2.2.2.RELEASE的jar包)
所以问题找到了,找到这个1.5.22.RELEASE的依赖,将这个jar包排除掉就可以了呗。
找依赖也很简单
image.png
image.png
人家工具还说明冲突的地方了,很明显
引入druid-spring-boot-starter 的时候,导致jar包冲突了,谁让他版本小呢,那就把它做掉就行了。
image.png
将冲突jar包冲突排除掉之后,启动项目

解决问题2

博主比较倒霉哈,还是有问题
image.png
于是有搜了下,解决方案是加个jdbc的依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.4.RELEASE</version>
</dependency>

试了下,确实可以解决问题,嘿嘿,那就懂了,还是依赖本身jar包的问题呗,于是检查了下依赖库,是
mybatis-spring-boot-starter中jdbc的版本太低了,于是开始升级依赖
将版本升到
image.png
再启动项目
image.png
漂亮完美启动!
04973B8E.jpg
这是我依赖的配置,大家可参考

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.2.2.RELEASE</version>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-autoconfigure</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--springboot+mybatis的依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.2</version>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>org.springframework</groupId>-->
<!--            <artifactId>spring-jdbc</artifactId>-->
<!--            <version>5.2.4.RELEASE</version>-->
<!--        </dependency>-->
        <!--MySQL数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>
        <!--Lombok依赖(可以配置也可以不用配置具体看自己)-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </dependency>
        <!--fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.24</version>
        </dependency>
        <!--druid数据源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.1</version>
        </dependency>
        <!--druid数据库连接池依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.18</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-autoconfigure</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.8.0-beta4</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.7.2</version>
            <type>jar</type>
        </dependency>
    </dependencies>

希望本帖子对大家有帮助

补充

对了,还有一个问题就是,我之前的旧项目为什么就好用呢,原因是如果有依赖冲突的话,maven的解决方案是这样的:
比如有如下两个依赖关系:

A -> B -> C -> D(V1)
F -> G -> D(V2)

这个时候项目中就出现了两个版本的D,这时maven会采用最短路径原则,选择V2版本的D,因为V1版本的D是由A包间接依赖的,整个依赖路径长度为3,而V2版本的D是由F包间接依赖的,整个依赖路径长度为2。
假设有如下两个依赖关系:

A -> B -> D(V1)
F -> G -> D(V2)

这个时候因为两个版本的D的依赖路径都是一样长,最短路径原则就失效了。这个时候Maven的解决方案是:按照依赖包在pom.xml中声明的先后顺序,优先选择先声明的包
我是属于第二种。
参考:https://blog.csdn.net/WinWill2012/article/details/71717811

猜你喜欢

转载自blog.csdn.net/weixin_40741732/article/details/131088598