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

本文记录了在IDEA中使用jetty启动项目时遇到EL表达式报错的问题,详细分析了错误原因,包括jetty版本、依赖配置、打包问题以及IDEA配置问题。通过排查,最终发现是IDEA的Jetty Server Settings未加载相关模块导致,勾选对应模块后问题解决。总结强调了解决问题时应细致分析错误信息并采取逐步排查的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

今天启动项目测试时,发送消息使用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.v20190610)导致使用了高版本的el包,但是高版本的el包没有此el表达式的代码。

解决方法

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

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

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.v20191022\lib\apache-jsp)。

总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值