2016-05-16 49 views
1

在tomcat 8.0.33中使用jstl時出現錯誤java.lang.NoSuchMethodError: javax.el.ExpressionFactory.getStreamELResolver()Ljavax/el/ELResolver;。我檢查了我的應用程序的WEB-INF/lib,它不包含任何衝突的內容。java.lang.NoSuchMethodError:javax.el.E​​xpressionFactory.getStreamELResolver()Ljavax/el/ELResolver;

此外,我檢查了el-api.jar文件存在於tomcat 8的lib文件夾中的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) 

如何解決這個問題寫的嗎?

+1

要說清楚的是,當你說你檢查了你的web應用程序的WEB-INF/lib和「它不包含任何有衝突的東西」......你的意思是沒有任何內容包含javax.el.E​​xpressionFactory類'? – dcsohl

+0

的確,除此之外的其他情況都是如此。 – BalusC

+0

@dcsohl:是的,我的應用程序的WEB-INF/lib文件夾中沒有類javax.el.E​​xpressionFactory的第二個版本。 – ares

回答

0

要解決類路徑中存在的同一類的不同版本的這些問題 - 最好的方法是啓用詳細的類加載並查看該類是否實際上是從預期的jar文件加載的。

從命令行我們可以運行java -verbose:class MyClassWithMain。這將輸出JVM中加載的所有類以及jar或加載它的類路徑上的任何類的名稱。一旦發現問題的根源,您可以將其刪除。 要在tomcat中啓用verbose:class,請參閱this answer