【问题标题】:java.lang.NoSuchMethodError: javax.el.ExpressionFactory.getStreamELResolver()Ljavax/el/ELResolver;java.lang.NoSuchMethodError: javax.el.E​​xpressionFactory.getStreamELResolver()Ljavax/el/ELResolver;
【发布时间】:2016-05-16 14:13:21
【问题描述】:

我在 tomcat 8.0.33 中使用 jstl 时收到错误 java.lang.NoSuchMethodError: javax.el.ExpressionFactory.getStreamELResolver()Ljavax/el/ELResolver;。我检查了我的应用程序的 WEB-INF/lib,它不包含任何冲突的内容。

我还从tomcat 8 的lib 文件夹中的el-api.jar 文件中检查了javax.el.ExpressionFactory 类的源代码。方法签名是public ELResolver getStreamELResolver()

我将应用程序从 tomcat 6.0.35 迁移到 tomcat 8.0.33 后出现此问题。该应用程序是使用jstl-1.2 编写的

完整的堆栈跟踪是

16-May-2016 19:14:54.119 SEVERE [ajp-nio-11009-exec-4] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [spring] in context with path [/app] threw exception [Request processing failed; nested exception is org.apache.tiles.impl.CannotRenderException: org.apache.tiles.util.TilesIOException: JSPException including path '/WEB-INF/JSP/APP/display.jsp'.] with root cause
 java.lang.NoSuchMethodError: javax.el.ExpressionFactory.getStreamELResolver()Ljavax/el/ELResolver;
    at org.apache.jasper.el.ELContextImpl.<clinit>(ELContextImpl.java:87)
    at org.apache.jasper.compiler.Validator$ValidateVisitor.prepareExpression(Validator.java:1617)
    at org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:750)
    at org.apache.jasper.compiler.Node$ELExpression.accept(Node.java:950)
    at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2376)
    at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2428)
    at org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2434)
    at org.apache.jasper.compiler.Node$Root.accept(Node.java:464)
    at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2376)
    at org.apache.jasper.compiler.Validator.validateExDirectives(Validator.java:1853)
    at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:217)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:356)
    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:585)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:363)
    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:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:720)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:584)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:523)
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:935)
    at org.apache.jasper.runtime.PageContextImpl.doInclude(PageContextImpl.java:679)
    at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:673)
    at org.apache.tiles.jsp.context.JspTilesRequestContext.include(JspTilesRequestContext.java:103)
    at org.apache.tiles.jsp.context.JspTilesRequestContext.dispatch(JspTilesRequestContext.java:96)
    at org.apache.tiles.renderer.impl.TemplateAttributeRenderer.write(TemplateAttributeRenderer.java:44)
    at org.apache.tiles.renderer.impl.AbstractBaseAttributeRenderer.render(AbstractBaseAttributeRenderer.java:106)
    at org.apache.tiles.renderer.impl.ChainedDelegateAttributeRenderer.write(ChainedDelegateAttributeRenderer.java:76)
    at org.apache.tiles.renderer.impl.AbstractBaseAttributeRenderer.render(AbstractBaseAttributeRenderer.java:106)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:670)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:336)
    at org.apache.tiles.template.InsertAttributeModel.renderAttribute(InsertAttributeModel.java:210)
    at org.apache.tiles.template.InsertAttributeModel.end(InsertAttributeModel.java:126)
    at org.apache.tiles.jsp.taglib.InsertAttributeTag.doTag(InsertAttributeTag.java:311)

... (truncated)

如何解决这个问题?

【问题讨论】:

  • 要清楚,当你说你检查了你的网络应用程序的 WEB-INF/lib 并且“它不包含任何冲突的东西”......你的意思是那里没有任何东西包含类 @ 987654328@?
  • 确实,例外情况并非如此。
  • @dcsohl:是的,我的应用程序的 WEB-INF/lib 文件夹中没有第二版的 javax.el.ExpressionFactory 类。
  • @dcsohl:我已经将 IBM 远程客户端 jar com.ibm.ws.ejb.thinclient_8.0.0.jar 放在了 tomcat 的父库中。事实证明,无论出于何种原因,IBM 也有 javax.el.ExpressionFactory,这是相互矛盾的。

标签: java tomcat jstl tomcat8


【解决方案1】:

要解决类路径中存在同一类的不同版本的此类问题 - 最好的方法是启用详细类加载并查看该类是否实际上是从预期的 jar 文件加载的。

我们可以从命令行运行java -verbose:class MyClassWithMain。这将输出 JVM 中加载的所有类以及 jar 的名称或加载它的类路径上的任何类。一旦找到问题的根源,就可以将其删除。 要在 tomcat 中启用verbose:class,请参阅this answer

【讨论】:

    猜你喜欢
    • 2014-06-20
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 2014-04-05
    • 2014-12-24
    • 2015-03-19
    • 2016-06-15
    相关资源
    最近更新 更多