创建maven工程时,并加入struts2框架,解析jsp页面的问题的时候,会出现如下异常
org.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: 1 in the generated java file
The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class files
An error occurred at line: 22 in the generated java file
The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory
通过查询资料
有博友写的文章 标题 unable to compile class for JSP(不能编译class)
文中提到结论:1、我的工程里的servlet.jar、jsp-servlet.jar的版本比较低与tomcat6.0相比。
2、tomcat的下面的lib里面不能与工程里面的jar相同(如果部署到tomcat上)。
3、把工程里面的两个jar包删除了,就解决了。
一直没有弄明白,直到查看了https://stackoverflow.com/questions/20428481/org-apache-jasper-jasperexception-unable-to-compile-class-for-jsp-tried-everyt
才大概明白
我的问题在于pom.xml中这段代码:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
</dependency>
getJspApplicationContext(ServletContext)是被添加到jsp2.1中,所以你在POM当中声明2.0版本是不够的,除此之外,如果你不加上provided的声明的话,那么他也会打包到你的应用程序中,它将会用于编译,尽管Tomcat当中已经有了更高版本的规范,所以这才会导致上述的结论出现 两个jar包的冲突问题,Tomcat6.0以上的服务实现了Servlet2.5和JSP2.1的规范,所以低版本与高版本发生了冲突,需要加provided限定,也就是打包项目的时候不再需要这个jar包。
所以你需要这样子书写依赖关系
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
我遇到的另外一个问题:
org.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: 1 in the generated java file
The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class files
我需要把tomcat版本换成7.0,用7.0运行起来
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
maven build 输入命令 tomcat7:run
如果servlet-api没有<scope>provided</scope>声明的时候会报下面的异常
java.lang.ClassCastException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter cannot be cast to javax.servlet.Filter
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:260)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:107)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4775)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5452)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
正确的设置如下
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>