部分功能页面没有进行前后端分离,使用的还是jsp技术。
容器本身是有包进行解析el的,如果在项目里引入了 javax.el
包会导致解析el表达式出错,具体报错如下:
2019-01-23 13:32:35,134 ERROR [org.apache.catalina.core.ContainerBase] Servlet.service() for servlet jsp threw exceptionjava.lang.LinkageError: javax/el/ExpressionFactory at org.apache.jsp.xxx
在jsp中使用了类似于这种el表达式的时候就会出现上面的报错 cxxxx.jsp
jsp编译之后生产的java文件大致是在
work/xxx/localhost/_/org/apache/jsp/xxx
容器不一样目录也会有差异。
jsp编译成的java为 cxxxx_jsp.java
_jspx_th_c_005fforEach_005f0.setItems(new org.apache.jasper.el.JspValueExpression("/WEB-INF/mxxxx/xxx/cxxxx.jsp(55,5) '${listAct}'",_el_expressionfactory.createValueExpression(_jspx_page_context.getELContext(),"${listAct}",java.lang.Object.class)).getValue(_jspx_page_context.getELContext()));
出现的原因: 项目A引用了项目B,项目B引用了项目C,项目C引用了项目D 项目D引入了 javax.el
这个包,导致这一层依赖传导到了A项目,A项目有一些非常老的功能还存在jsp页面,就发生了这个报错。 而因为是jsp报错,在应用本身的日志文件是没有报错日志的,还只能在容器本身的日志去找。 起先是以为表达式或者传到jsp的对象存在问题,因为报错日志不明显,只能大致知道是el表达式有问题,jsp只在大学的书本上用过,工作之后从velocity到freemarker和thymeleaf等等,就是没有用过jsp。。。
最后对比了前后的war包发现多了一个javax.el
的包在应用的lib内,找到依赖关系,这才破案。