我有一个用java实现的Web服务项目,它还包含jsp页面。我在我的机器上将它部署在jetty 8.1.5上并且它正常工作。但是,当我在带有jetty 8.1.3的Windows Server 2003上进行部署时,会出现此异常:
org.apache.jasper.el.ELContextImpl cannot be cast to org.apache.jasper.runtime.ELContextImpl
这是完整的痕迹:
java.lang.ClassCastException: org.apache.jasper.el.ELContextImpl cannot be cast to org.apache.jasper.runtime.ELContextImpl
at org.apache.jasper.runtime.PageContextImpl.evaluateExpression(PageContextImpl.java:1002)
at org.apache.jsp.home.index_jsp._jspService(org.apache.jsp.home.index_jsp:52)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:403)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:598)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:486)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:542)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:413)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:271)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:98)
at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:557)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:735)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:598)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:486)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:499)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:413)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)
at org.eclipse.jetty.server.Server.handle(Server.java:350)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:890)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:944)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:630)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:606)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538)
at java.lang.Thread.run(Unknown Source)
知道这个例外是什么以及如何修复它?
答案 0 :(得分:11)
如果您的网络应用程序在jasper.jar
中附带了jetty.jar
,servlet.jar
/WEB-INF/lib
等特定于servletcontainer的JAR文件,可能会出现这种情况,原因不明。这反过来与目标servletcontainer上的不同版本化JAR文件冲突。
从您的webapp /WEB-INF/lib
中删除该servletcontainer特定的JAR文件。它不属于那里。它应该已经由servletcontainer本身提供。
答案 1 :(得分:5)
IF 您正在使用maven(我在没有回复的情况下询问了评论),您可以使用“提供”范围避免冲突的jar。当您将其部署用于生产时,不包括罐子。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
我不确定码头的罐子,但它可能是相同的。
IF 你是不使用maven,你应该将冲突的jar(servlet和jetty)移动到你的开发容器lib文件夹并从你的应用程序WEB-INF中删除它们/ lib文件夹。
答案 2 :(得分:4)
如果您的webapp的文件夹/ WEB-INF / lib不包含jasper.jar(请参阅BalusC的回答),请检查您的容器中是否有另一个webapp正在运行。然后检查该webapp是否在其文件夹/ WEB-INF / lib中包含jasper.jar。这发生在我们身上。从这些webapps中移除jasper.jar(原文如此!),问题可以解决。显然,webapps并不像其应有的那样被隔离。当我们从Tomcat6切换到Tomcat7并且jasper.jar(版本6)与我们的一个webapps意外捆绑时出现问题。
答案 3 :(得分:3)
除了提到的答案之外,还要注意另外一件事。我在同一个Tomcat 7.0.42实例下部署了另一个war,它在WEB-INF / lib下有一个jsp-2.1-6.0.2.jar。这个jar有org.apache.jasper.runtime.ELContextImpl类。
我的理解是每个webapp都有自己的类加载器,而一个webapp加载的类文件对另一个webapp是不可见的。仍然没有工作,我删除了另一个有jsp.jar的战争,并重新启动了我的tomcat,令我惊讶的是异常不再发生了。不知何故,这个类被加载并导致问题。
有趣的是,这两场战争在Tomcat 6.x中运行得非常好。
答案 4 :(得分:0)
我遇到了同样的问题并尝试了所有建议,没有一个对我有用。我终于发现问题是在使用Spring Boot覆盖我的tomcat版本之后引起的,因为我有
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.1.0.M2</version>
删除Spring Boot可以解决问题。 This回答可以提供使用Spring Boot + Maven + Tomcat 8的解决方案。
答案 5 :(得分:0)
对我来说(Jetty 8.1.14),这个确切的错误消息实际上是由同一个Jetty容器中的另一个webapp引起的。您运行的是多个Web应用程序吗?
答案 6 :(得分:0)
在<context>
中添加此行:
<Loader delegate="true" />
此问题与应用程序中的jar冲突有关 标签。看起来像:
<?xml version='1.0' encoding='utf-8'?>
<!-- The contents of this file will be loaded for each web application -->
<Context>
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Loader delegate="true" /> <!--this line-->
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<!-- Uncomment this to enable Comet connection tacking (provides events on session expiration as well as webapp lifecycle) -->
<!--
<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
-->
</Context>