你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

记一次jar包冲突

2021/11/23 17:09:53

准备在工作流程的项目中加入数据校验,然后导入jar包

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>4.3.1.Final</version> 
</dependency>

加入一个实体
加一个控制层
但在实体的一个属性上写注解@NotBlank的时候,发现飘红,怎么回事?先不管再加一个正则试试,又飘红,咋回事?网上找一下原因,说是版本不兼容,说spring boot版本过高,但我不能改spring boot的版本,所以继续看其他原因,再看我spring boot版本2.3.1,于是突然又看到一个博客,说从2.3x后spring boot已经兼容了validator,于是把之前哪个左边删除了,重新把新的包导入

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

nice~每个校验注解都能用了,也不飘红了,就很虚浮,把控制层随便先写一个接口试试

@RestController
public class CheckTestController {
    @PostMapping("/check")
    public CheckTest check(@RequestBody @Valid CheckTest checkTest) {
        return checkTest;
    }

}

可以没报错,距离成功只有一步 ctrl+shift+f10 ,启动吧!初始化数据。。。加载工作流数据,只见代码一页一页的滚动。。。说时迟那时快,突然!一个红色的单词映入眼帘–ERROR,WDNMD!

什么原因?
报错如下:

ERROR 9944 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

An attempt was made to call a method that does not exist. The attempt was made from the following location:

    javax.el.ELManager.getExpressionFactory(ELManager.java:38)

The following method did not exist:

    javax.el.ELUtil.getExpressionFactory()Ljavax/el/ExpressionFactory;

The method's class, javax.el.ELUtil, is available from the following locations:

    jar:file:/C:/Users/CC/.m2/repository/javax/el/el-api/2.2/el-api-2.2.jar!/javax/el/ELUtil.class
    jar:file:/C:/Users/CC/.m2/repository/org/glassfish/jakarta.el/3.0.3/jakarta.el-3.0.3.jar!/javax/el/ELUtil.class

The class hierarchy was loaded from the following locations:

    javax.el.ELUtil: file:/C:/Users/CC/.m2/repository/javax/el/el-api/2.2/el-api-2.2.jar


Action:

Correct the classpath of your application so that it contains a single, compatible version of javax.el.ELUtil

?????这是啥?这是jar包冲突啊,el-api.jar就是个表达式的jar包依赖罢了,然鹅,一想我maven中没有引入啊

jar包冲突情况,A里已经有B了,你又引入了一次B,导致冲突,或者你单独引入了两个A

解决思路,找到两个冲突的包,把版本低的删除,因为高版本一般向下兼容,如果高版本的不行再换成低版本的

我这儿最后一步步排查,发现工作流已经中自己引入了一个包el-api-2.2.jar

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
</dependency>   

中也引入了el的包,所以经过取舍,我把这个spring-boot-starter-validation依赖删除了,重新导入一个单独的校验依赖(需要注意的是该依赖的版本和spring boot 2.3x是兼容的) ↓

<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.4.0.Final</version>
        </dependency>

这个依赖只是单纯的校验依赖,所以el.jar不会有冲突

总结:开始是validator版本过低与spring boot2.3.x不兼容,之后导入spring boot validator的模板,因为该模板和工作流都分别依赖了不同版本的el.jar,导致jar包冲突,最后我把spring boot validator的模板删除解决了el.jar冲突,引入了高版本的validator和spring boot 2.3x兼容,项目成功运行~ ~ ~ ~ ~