Unable to compile class for JSP

错误背景:
   项目原本运行在tomcat 6底下, 因某些原因需要升级到tomcat 7, 于是在部署完成tomcat 7.0.69之后,把原tomcat6底下的war包拷贝到tomcat 7底下的webapps目录下, 关闭tomcat 6, 启动tomcat 7, 启动过程无报错. 打开浏览器, 访问项目首页, 报无法解析jsp的错误. 以下为此次错误的解决之道:
STEP 1:
先来个错误日志(注意红色字体):
严重: Servlet.service() for servlet [jsp] in context with path [/我是项目名称] threw exception [ Unable to compile class for JSP] with root cause
java.lang.IllegalArgumentException: Page directive: invalid value for import at org.apache.jasper.compiler.Node$PageDirective.validateImport(Node.java:628)
at org.apache.jasper.compiler.Node$PageDirective.addImport(Node.java:609)
at org.apache.jasper.compiler.Parser.parsePageDirective(Parser.java:352)
at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:473)
at org.apache.jasper.compiler.Parser.parseFileDirectives(Parser.java:1773)
at org.apache.jasper.compiler.Parser.parse(Parser.java:135)
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:242)
at org.apache.jasper.compiler.ParserController.parseDirectives(ParserController.java:119)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:194)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:374)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:354)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:341)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:662)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:364)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.ts.security.filter.RequestMethodFilter.doFilter(RequestMethodFilter.java:49)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.ts.security.filter.SecurityFilter.doFilter(SecurityFilter.java:71)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.ts.security.filter.RequestHeadFilter.doFilter(RequestHeadFilter.java:55)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.travelsky.pss.abframe.filter.LogFilter.doFilter(LogFilter.java:94)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:186)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:619)
STEP 2:
看step 1的错误日志里面红色字体部分, 他们是这个错误日志的关键部分。第一步, 怀疑是不是tomcat 7并没有部署成功, 但它在没有部署项目上去的时候成功启动过, 所以怀疑不成立; 第二步, 怀疑jar包冲突, 项目的某些jar包, 如servlet-api.jar等于tomcat本身的jar冲突, 很快也排除此猜测, 因为tomcat它优先加载的是项目路径底下的jar, 找不到才加载其本身的jar包; 其实事情发展到现在已经无头绪了, 惟有继续BD搜索, 万幸, 找到一个有遇到同样问题的博主, 原来是页面的page import标签搞得鬼.. 先看原来的<%@ page import="java.lang.Exception;" %>, 看到Exception后面那个分号( ;)了吗, 尼玛, 就是它, 删除它就好, tomcat 7不认它...
该怎么说呢, 理论上, 按照jsp编写规范, 这个分号的确是不该存在的, 可是程序员习惯写完一段代码就会顺手加上个分号... anyway, 坑爹就是了

猜你喜欢

转载自anthrax2.iteye.com/blog/2295875