1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Idea 使用jetty启动使用el表达式报错的问题 原因及排查

Idea 使用jetty启动使用el表达式报错的问题 原因及排查

时间:2024-06-13 09:17:53

相关推荐

Idea 使用jetty启动使用el表达式报错的问题 原因及排查

问题

今天启动项目测试时,发送消息使用el表达式报错:java.lang.NoClassDefFoundError: javax/el/ELContext

一开始怀疑是idea又发疯了,重新maven->reimport也不行。

el包的pom.xml项目配置如下:

<!-- EL表达式 开始--><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId><version>8.0.20</version><scope>provided</scope></dependency><!-- EL表达式 结束-->

因为线上用的是Tomcat,已包含el包,所以需要设置provided,打包时去掉,以防冲突。但是本人用的是jetty,因此需要去掉这个scope或者设为compile。

但是查了下scope具体含义,如下:

compile(默认)含义:compile 是默认值,如果没有指定 scope 值,该元素的默认值为 compile。被依赖项目需要参与到当前项目的编译,测试,打包,运行等阶段。打包的时候通常会包含被依赖项目。provided含义:被依赖项目理论上可以参与编译、测试、运行等阶段,相当于compile,但是再打包阶段做了exclude的动作。适用场景:例如, 如果我们在开发一个web 应用,在编译时我们需要依赖 servlet-api.jar,但是在运行时我们不需要该 jar 包,因为这个 jar 包已由应用服务器提供,此时我们需要使用 provided 进行范围修饰。

按理来说provided测试或运行的时候会包含el包的,为什么没有呢?

怀疑是jetty版本太高的原因(jetty-distribution-9.4.19.v0610)导致使用了高版本的el包,但是高版本的el包没有此el表达式的代码。

解决方法

1、临时解决就是把scope值去掉或改为compile,先能用。但是最怕不小心改了提交到线上去,影响其他人或线上的功能。风险大。

2、更新jetty版本为更高版本:jetty-distribution-9.4.22.v1022,还是不行

3、本地用mvn clean package -DskipTests -U打包看看有没有embed包,一开始发现是有的。然后用idea里的mvn工具跑发现是没有的,这就很奇怪了,why?原因是RBKD-SERVICE引用了fcmodule,而embed包是在fcmodule的pom.xml,本地仓库中fcmodule是旧的,所以直接在cmd命令跑是有的,而idea里是直接用了fcmodule里面的编译后的jar包,并没有引用仓库里旧的,所以是没有的。重新把fcmodule打包到本地仓库,再试试就没有了。- 解决embed包两个地方打包后不一致的问题

4、实在想不到为什么会报错,jetty应该是有el包,跟tomcat的路径一样的呀,这种都是必须实现的基本协议,查看jetty的lib包:org.mortbay.jasper.apache-el-8.5.40.jar(比如路径:org\apache\el\lang跟tomcat一样,只是包名不一样而已,el相关类是有的,一模一样),但是为什么idea使用jetty会找不到el的类呢?怀疑是idea配置的问题,用排除法:直接在外面跑jetty容器,然后看看有没有el类,会不会报错?jetty运行命令:java -jar start.jar -Dname=RBKD-SERVICE jetty.http.port=9001指定项目以9001端口运行。发现能解析el表达式,没问题。那就是idea的问题。

5、查看idea的jetty配置,终于找到原因:在Jetty Server Settings那里有jetty的相关模块加载,要勾选modules\apache-jsp.mod模块运行才会加载到那el相关的jar包(因为org.mortbay.jasper.apache-el-8.5.40.jar的路径为:jetty-distribution-9.4.22.v1022\lib\apache-jsp)。

总结

遇到问题要先仔细解读报错信息,比如这次java.lang.NoClassDefFoundError: javax/el/ELContext很明显告诉你找不到这个类的错误,那就说明没有加载到相关jar包。遇到问题不要慌,要一步步排查,最简单好用的就是假设排除法,怀疑哪里有问题,然后去验证,一步步排查,直到找到原因。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。