无法转换为org.apache.jasper.r.

我有一个用java实现的Web服务项目,它还包含jsp页面。 我在我的机器上将它部署在jetty 8.1.5上并且它正常工作。 但是,当我使用jetty 8.1.3部署在Windows Server 2003上时,它会出现以下exception:

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) 

知道这个例外是什么以及如何修复它?

如果您的webapp在/WEB-INF/lib附带了servletcontainer特定的JAR文件(例如jasper.jarjetty.jar servlet.jar等),则可能会发生这种情况。 这反过来与目标servletcontainer上的不同版本化JAR文件冲突。

从webapp的/WEB-INF/lib删除该servletcontainer特定的JAR文件。 它不属于那里。 它应该已经由servletcontainer本身提供。

也可以看看:

  • 如何在Eclipse项目中导入javax.servlet API? (这并不完全回答你的具体问题,但这至少在技术上是同样的核心问题,应该让你更好地理解这个常见的启动器的错误)

如果您正在使用maven(我在没有回复的情况下询问了评论),您可以使用“提供”范围避免冲突的jar。 将其部署用于生产时,不包括jar。

  javax.servlet jsp-api 2.0 provided   javax.servlet servlet-api 2.5 provided  

我不确定docker的jar子,但它可能是相同的。

如果使用maven,则应将冲突的jar(servlet和jetty)移动到developmpent容器lib文件夹,并将其从应用程序WEB-INF / lib文件夹中删除。

如果您的webapp的文件夹/ WEB-INF / lib不包含jasper.jar(请参阅BalusC的回答),请检查您的容器中是否有另一个webapp正在运行。 然后检查该webapp是否在其文件夹/ WEB-INF / lib中包含jasper.jar。 这发生在我们身上。 从这些webapps中移除jasper.jar(原文如此!),问题可以解决。 显然,webapps并不像其应有的那样被隔离。 当我们从Tomcat6切换到Tomcat7时出现问题,并且jasper.jar(版本6)与我们的一个webapps意外捆绑在一起。

除了提到的答案之外,还要注意一件事。 我在同一个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,令我惊讶的是exception不再发生。 不知何故,这个类被加载并导致问题。

有趣的是,这两场战争在Tomcat 6.x中运行得非常好。

我遇到了同样的问题并尝试了所有的建议,没有一个对我有用。 我终于发现问题是在使用Spring Boot覆盖我的tomcat版本之后引起的,就像我一样

  org.springframework.boot spring-boot-starter-parent 1.1.0.M2 

删除Spring Boot可以解决问题。 这个答案可以提供使用Spring Boot + Maven + Tomcat 8的解决方案。

对我来说(Jetty 8.1.14),这个确切的错误消息实际上是由同一个Jetty容器中的另一个webapp引起的。 您运行的是多个Web应用程序吗?