介于现在jbpm工作流现在在一些公司尤其是政府等事业单位里面应用越来越多的情况,但是网上一些关于jbpm4和Struts2、Spring和hibernate的整合过程中出现的异常资料比较少,所以总结一下在此整合的过程中出现的比较新手在配置整合的时候经常遇到的异常,其中一个比较典型的异常就是:expression factory class not found : javax.el.ELException: expression factor,那么接下来分享一下产生此异常的原因和解决的方法:
原因:由于jbpm4工作流自带的有与数据库连接的session-factory,而hibernate也有自己的session-factory,所以在两者之间的整合导入jar包的过程中就会出现jar包冲突的问题,如果jar包发生冲突那么我们在启动工程之后,在发布流程图的时候,可能会产生Resource:/resource a.jdpl.xml not exist,也可能在浏览器访问的时候产生:
javax.servlet.ServletException: java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;" the class loader (instance of org/apache/jasper/servlet/JasperLoader) of the current class, org/apache/jsp/login_jsp, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ExpressionFactory used in the signature org.apache.jasper.servlet.JspServlet.service(JspServlet.java:274) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:88) org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
root cause
java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;" the class loader (instance of org/apache/jasper/servlet/JasperLoader) of the current class, org/apache/jsp/login_jsp, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ExpressionFactory used in the signature org.apache.jsp.login_jsp._jspInit(login_jsp.java:23) org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52) org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:159) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:88) org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
这些异常就是jar包冲突导致的,解决办法有两种:
1、第一种解决办法:在你的tomcat目录里面有一个lib的jar包文件夹,tomcat\apache-tomcat-6.0.14\apache-tomcat-6.0.14\lib,里面有一个el.jar的jar包,就是这个jar包和jbpm4的juel-api.jar、juel-engine.jar和juel-impl.jar三个jar包之间的冲突,在配置的时候不要更改tomcat\apache-tomcat-6.0.14\apache-tomcat-6.0.14\lib里面的el.jar包,就放置在这个lib里面,而在导入jbpm4的jar包到project项目里面的时候,去掉WEB-INF里面的lib里面的juel-api.jar、juel-engine.jar三个jar包就不会产生这个异常了!
2、第二种解决办法就是:将tomcat\apache-tomcat-6.0.14\apache-tomcat-6.0.14\lib里面的el.jar这个jar包删除,将juel-api.jar、juel-engine.jar和juel-impl.jar三个jar包导入到tomcat\apache-tomcat-6.0.14\apache-tomcat-6.0.14\lib里面,然后在导入jbpm4的jar包到WEB-INF的lib里面的时候删除juel-api.jar、juel-engine.jar和juel-impl.jar这三个jar包就可以了,这时候tomcat里面就有了这三个jar包了,不用在WEB-INF里面的lib再去配置了!