Tomcat 7.0.82引入IBM EJB瘦客户端JAR后出现NoSuchMethodError求助
问题原因及解决思路
这个错误的核心是EL(表达式语言)类库的版本冲突,根源就在你放到Tomcat/lib目录的com.ibm.ws.ejb.thinclient_7.0.0.jar上:
- Tomcat 7.0.x依赖的是EL 2.2规范,这个版本里的
javax.el.ExpressionFactory新增了无参的newInstance()方法,而Tomcat负责处理JSP的Jasper引擎初始化时必须调用这个方法。 - 但IBM的这个EJB瘦客户端jar包里自带了旧版本的EL类(应该是EL 2.1或者更早),这些旧类里根本没有这个无参的
newInstance()方法。 - 因为Tomcat的类加载规则是优先加载
lib目录下的jar包,所以旧版本的EL类直接覆盖了Tomcat自带的EL 2.2类,导致Jasper调用方法时找不到,就抛出了NoSuchMethodError。
解决建议
- 优先尝试把
com.ibm.ws.ejb.thinclient_7.0.0.jar从Tomcat/lib移到你的Web应用的WEB-INF/lib目录下。这样Web应用的类加载器会先加载Tomcat核心的EL类,再加载应用内的jar,就不会出现覆盖问题了。 - 如果移动后还是有冲突,可以手动解压这个IBM的jar包,删除里面所有
javax.el相关的类文件,然后重新打包。不过这么做之前要确认这些EL类不是EJB客户端必需的,避免影响业务功能。
内容的提问来源于stack exchange,提问作者Prash
相关产品推荐
相关产品推荐

