晚安、巴黎

每天进步一点点!!!

Activiti工作流引擎与JSTL标签库引发的血案

背景

由于公司业务的需要,要求引入工作流程引擎组件。经项目组商讨,最终决定使用Activiti工作流组件;并且由于涉及展示层页面不多,所以没有要求前端资源,直接由服务端开发团队使用JSP页面作为前端展示层,并使用Tomcat作为WEB服务器,SpringMVC作为控制层。

涉及到的主要组件版本

Activiti工作流版本:6.0.0

Spring版本:4.3.12.RELEASE    

JDK版本:1.8.0_151(64-Bit)

Tomcat版本:8.0.28

JSTL标签库版本:1.2(由于在JSP页面使用了jstl标签,故引入此依赖库)

Maven依赖管理组件版本:3.3.9

一切都准备好,并且开发了几个JSP页面,为了方便展示数据,JSP页面使用了jstl标签库。然后在启动Tomcat后使用Google浏览器访问页面时,浏览器直接出现以下异常:

HTTP Status 500 - java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.views.login_jsp
type Exception report

message java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.views.login_jsp

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.views.login_jsp
	org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:176)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168)
	org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)
	org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1286)
	org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1041)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:984)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	org.activiti.explorer.JsonpCallbackFilter.doFilter(JsonpCallbackFilter.java:62)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
root cause

java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.views.login_jsp
	java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:131)
	org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:62)
	org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:171)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168)
	org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)
	org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1286)
	org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1041)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:984)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	org.activiti.explorer.JsonpCallbackFilter.doFilter(JsonpCallbackFilter.java:62)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
note The full stack trace of the root cause is available in the Apache Tomcat/8.0.28 logs.

Apache Tomcat/8.0.28

问题分析

第一、Tomcat启动正常,没任何异常信息,排除Tomcat启动出错导致此异常的线索。

第二、从报错来看,主要异常堆栈提到

org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.views.login_jsp

首先我认为是某个依赖包少了,看到JasperException,我认为是解析JSP页面的jasper.jar或者是jasper-el.jar少了,但是这两个依赖包默认Tomcat服务器就会提供的且确实在Tomcat安装目录的lib目录里面找到了这两个依赖。排除缺少jasper.jar或者是jasper-el.jar这两个依赖包导致此异常的线索。

第三、考虑JSP页面使用了jstl标签,但是这个jstl.jar也已经在pom文件中引入了对应的坐标,排除缺少jstl依赖导致此异常的线索。

第四、考虑是否是pom文件引入的例如servlet-api.jar或者是jsp-api.jar等依赖跟Tomcat服务器中自带的相关依赖冲突所致;经排查,在pom文件里面引入的servlet-api.jar和jsp-api.jar都提供了<scope>provided</scope>标签,故排查依赖冲突导致此异常的线索。

第五、注意到我们在画Activiti流程图的时候,在排他网关处一般都会写一些条件表达式ConditionExpression,以便使流程符合我们写好的条件时进入对应的下一个节点。这里写的条件其实也是使用了Activiti内置的标签进行解析和处理的,思考这会不会跟我们引入的jstl标签库冲突呢?

经过长时间的排查和分析,发现问题就在此处,Activiti流程引擎的关键依赖activiti-engine里面还依赖了相关内置的标签库,通过在工程pom文件所在目录执行Maven命令 mvn dependency:tree 分析发现有以下4个:juel-impl,juel-api,juel,juel-spi

依赖了4个标签库,我们这么排除呢?没办法,此处我是一个一个进行排查的,最终排除掉juel-spi后程序一切正常,页面也正常可以访问。

总结

在使用Activiti流程引擎时,假如有JSP页面且引入了额外的jstl标签库,那么就会出现如上异常。解决办法就是在引入activiti-engine依赖时,排除掉Activiti内置的一个标签库依赖即可,如下Maven写法,添加<exclusions>标签

<dependency>
      <groupId>org.activiti</groupId>
      <artifactId>activiti-engine</artifactId>
      <version>6.0.0</version>
      <exclusions>
          <exclusion>
              <groupId>de.odysseus.juel</groupId>
              <artifactId>juel-spi</artifactId>
          </exclusion>
      </exclusions>
</dependency>

以上就是Activiti和JSTL标签库混合使用时出现的问题以及分析和解决思路。

由于排查过程中花费了较多时间,故当作为是一个“血案”~~~





阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012185242/article/details/79972012
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Activiti工作流引擎与JSTL标签库引发的血案

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭