org.apache.jasper.el.E​​LContextImpl不能转换为org.apach

2019-06-28 06:25发布

我在Java中实现Web服务项目,它也包含jsp页面。 我将它部署在我的机器上码头8.1.5和它工作正常。 但是,当我在Windows Server 2003与码头8.1.3部署它给出了这样的例外:

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)

任何想法,这是什么例外,如何解决呢?

Answer 1:

这可能发生,如果你的webapp附带特定servletcontainer-JAR文件,如jasper.jarjetty.jar servlet.jar等在/WEB-INF/lib的一些不明原因。 这又与目标servletcontainer不同的版本控制的JAR文件相冲突。

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

也可以看看:

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


Answer 2:

如果你正在使用maven(我问一个注释无反应),你能避免使用“规定”范围抵触的罐子。 当你部署生产,罐不包括在内。

<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,你应该将你的抵触的罐子(servlet和码头)到你的发展探析容器lib文件夹和应用程序的WEB-INF / lib文件夹中删除它们。



Answer 3:

如果你的Web应用程序不包含jasper.jar(见BalusC的回答)的文件夹/ WEB-INF / lib目录,请检查您的容器中其他Web应用是否正在运行。 然后检查如果Web应用程序中包含的文件夹/ WEB-INF / lib下一个jasper.jar。 这发生在我们身上。 从这些web应用移除jasper.jar(原文如此!),这个问题可以解决。 显然,web应用是不为别的,因为他们应该是meach分离出来的。 问题出现了,因为我们从切换到的tomcat6和Tomcat7 jasper.jar(第6版)与我们的Web应用程序的一个意外捆绑。



Answer 4:

除了提到的答案,注意一两件事。 我已经有它的WEB-INF / lib目录下的一个JSP的2.1-6.0.2.jar相同的Tomcat 7.0.42实例下展开另一场战争。 这个罐子有org.apache.jasper.runtime.ELContextImpl类。

我的理解是,每一个web应用都有自己的类加载器和一个Web应用程序加载的类文件是不是其他的web应用程序可见。 不过因为什么也没有工作,我删除了其他战争,有这样的jsp.jar并重新启动我的Tomcat和让我吃惊的例外是不再来了。 不知怎的,这个类是越来越加载并导致了问题。

有趣的是,这两种战争在Tomcat中6.x中完全正常工作



Answer 5:

我面临着同样的问题,尝试了所有的建议,但没有为我工作。 我终于找到了这一问题是使用Spring启动重写我的Tomcat的版本后引起的,因为我有

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

卸下春天引导解决这个问题。 这个答案可能为使用Spring +引导+ Maven的Tomcat的8解决方案。



Answer 6:

对我来说,(码头8.1.14),这个确切的错误信息实际上是由在同一个码头集装箱另一个Web应用程序引起的。 你运行不止一个web应用吗?



Answer 7:

添加在此行<context>

<Loader delegate="true" />

这个问题是在应用程序标签的罐子冲突有关。 这看起来像:

<?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>


文章来源: org.apache.jasper.el.ELContextImpl cannot be cast to org.apache.jasper.runtime.ELContextImpl
标签: java jsp Jetty