在 Tomcat 8.0.15 和 java 8 上解决 tomcat proprietaryEvaluate 异常

Resolving tomcat proprietaryEvaluate exception on Tomcat 8.0.15 & java 8

我必须从 Java 7 & tomcat 7.0.57 的执行环境切换到 java 8 & tomcat 8.0.15。为此,我正在测试一个我知道在 J7/TOMCAT7 上运行良好的网络应用程序。 我正在使用配置为使用 java 8 的 Maven,并且部署进行得很顺利。同时,当我尝试加载我的主页时,我在执行期间遇到了这个异常:

An error occurred at line: 427 in the jsp file: /index.jsp The method proprietaryEvaluate(String, Class, PageContext, ProtectedFunctionMapper, boolean) in the type PageContextImpl is not applicable for the arguments (String, Class, PageContext, null)

完整堆栈跟踪:

Stacktrace: at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:103) at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:199) at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:450) at org.apache.jasper.compiler.Compiler.compile(Compiler.java:361) at org.apache.jasper.compiler.Compiler.compile(Compiler.java:336) at org.apache.jasper.compiler.Compiler.compile(Compiler.java:323) at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340) at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) at ev.resourceManager.easyvols.InnerJSPServlet.service(InnerJSPServlet.java:91) at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source)

请注意,我没有使用任何框架,例如 Struts 或 Spring。

解决此异常的解决方案是什么?

我在升级时遇到了同样的问题,问题是我部署的 WAR 包含了 jasper jar,这不应该。我删除了它,因为 Tomcat 提供了它自己的(并且 TC8 中的方法签名与 TC7 中的版本不同)并且它现在可以工作了。

我确认@Toby 的解决方案。 我只是添加了一些有助于诊断的上下文元素。

我的网络应用程序是使用 Tomcat 8.0.35 和 Oracle JDK 1.8.0_91.

开发的

为了部署测试的意义,我们选择 运行 RaspberryPi 上的应用程序(Raspbian 发行版:2016-09-23-raspbian-jessie),它使用Tomcat 8.0.14 和 Oracle JDK 1.8.0_65.

我们必须 "downgrade" 该应用程序才能与 RasPi 软件兼容,但遇到了很多困难,每个困难都只指向 JSP 以前曾经工作过的。 我们首先想到的是 taglib JSTL Core,它是所有 JSP 行的公共元素,但我可以保证除了 Jasper 包之外,不需要更改项目的库和构建路径中的任何内容。

正在清理 POM 的这个元素并解决所有问题。

确保 Tomcat 工作目录已刷新,因为这将保存缓存文件。为此,只需删除工作目录并重新启动 Tomcat.

在我们的例子中,从 Tomcat 7 迁移到 8.5 时,工作目录也被复制,导致给定的异常。我们删除并更新了 lib 文件夹中的多个 jar,并在此过程中多次重新启动 Tomcat,但均未成功。清理工作目录是唯一有效的方法。