org.apache.jasper.el.E LContextImpl无法强制转换为org.apache.jasper.runtime.ELContextImpl

问题描述 投票:12回答:7

我有一个用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)

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

java jsp jetty
7个回答
11
投票

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

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

See also:


5
投票

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

我不确定码头的罐子,但它可能是相同的。

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


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
投票

除了提到的答案之外,还要注意一件事。我在同一个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中运行得非常好。


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的解决方案。


0
投票

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


0
投票

<context>中添加以下行:

<Loader delegate="true" />

此问题与application标记中的冲突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>
© www.soinside.com 2019 - 2024. All rights reserved.