12

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

知道这个异常是什么以及如何解决它吗?

4

7 回答 7

11

如果您的 web 应用程序附带特定于 servletcontainer 的 JAR 文件,例如jasper.jar,jetty.jar servlet.jar等,则可能会发生这种情况,/WEB-INF/lib原因不明。这又与目标 servlet 容器上的不同版本 JAR 文件冲突。

从您的 web 应用程序的/WEB-INF/lib. 它不属于那里。它应该已经由 servletcontainer 本身提供。

也可以看看:

于 2012-09-12T16:45:41.123 回答
5

如果您使用的是 maven(我在没有回应的情况下发表了评论),则可以使用“提供的”范围避免冲突的 jar。当您将其部署到生产环境时,不包括 jars。

<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,则应将有冲突的 jars(servlet 和 jetty)移动到您的开发容器 lib 文件夹中,并将它们从您的应用程序 WEB-INF/lib 文件夹中删除。

于 2012-09-19T13:31:35.813 回答
4

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

于 2013-09-23T13:12:53.223 回答
3

除了提到的答案之外,还要注意一件事。我在同一个 Tomcat 7.0.42 实例下部署了另一场战争,该实例在其 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 中运行得很好。

于 2013-10-08T04:34:18.170 回答
0

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

于 2015-02-26T18:39:44.200 回答
0

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

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.1.0.M2</version>

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

于 2014-11-09T15:11:39.507 回答
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>
于 2019-03-27T18:50:19.483 回答