我最近将我的 Struts Web 项目从 Tomcat 版本 9.0.87 迁移到 9.0.88。当我启动 tomcat 时,我无法访问该站点并看到空白页面。并在日志中发现以下错误
java.lang.NoClassDefFoundError: Could not initialize class org.apache.jasper.compiler.EncodingDetector
at org.apache.jasper.compiler.ParserController.determineSyntaxAndEncoding(ParserController.java:324) ~[jasper.jar:9.0.89]
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:201) ~[jasper.jar:9.0.89]
at org.apache.jasper.compiler.ParserController.parseDirectives(ParserController.java:128) ~[jasper.jar:9.0.89]
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:203) ~[jasper.jar:9.0.89]
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:392) ~[jasper.jar:9.0.89]
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:368) ~[jasper.jar:9.0.89]
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:352) ~[jasper.jar:9.0.89]
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:603) ~[jasper.jar:9.0.89]
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:399) ~[jasper.jar:9.0.89]
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379) ~[jasper.jar:9.0.89]
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327) ~[jasper.jar:9.0.89]
74 more
Caused by: java.lang.ExceptionInInitializerError: Exception javax.xml.stream.FactoryConfigurationError: Provider com.ctc.wstx.stax.WstxInputFactory not found [in thread "http-nio-8080-exec-2"]
at javax.xml.stream.FactoryFinder.newInstance(FactoryFinder.java:184) ~[?:?]
at javax.xml.stream.FactoryFinder.newInstance(FactoryFinder.java:135) ~[?:?]
at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:248) ~[?:?]
at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:210) ~[?:?]
at javax.xml.stream.XMLInputFactory.newFactory(XMLInputFactory.java:185) ~[?:?]
at org.apache.jasper.compiler.EncodingDetector.<clinit>(EncodingDetector.java:41) ~[jasper.jar:9.0.89]
at org.apache.jasper.compiler.ParserController.determineSyntaxAndEncoding(ParserController.java:324) ~[jasper.jar:9.0.89]
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:201) ~[jasper.jar:9.0.89]
at org.apache.jasper.compiler.ParserController.parseDirectives(ParserController.java:128) ~[jasper.jar:9.0.89]
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:203) ~[jasper.jar:9.0.89]
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:392) ~[jasper.jar:9.0.89]
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:368) ~[jasper.jar:9.0.89]
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:352) ~[jasper.jar:9.0.89]
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:603) ~[jasper.jar:9.0.89]
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:399) ~[jasper.jar:9.0.89]
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379) ~[jasper.jar:9.0.89]
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327) ~[jasper.jar:9.0.89]
74 more
当我检查 Tomcat 9.0.88 的变更日志时,我在 Jasper 部分下找到了这一行:
如果应用程序使用自定义 XMLInputFactory,则防止 Web 应用程序的 ClassLoader 被 JSP 编译器固定。基于西蒙·尼德伯格的建议。 (舒尔茨)
我已将包含
com.ctc.wstx.stax.WstxInputFactory
的 jar 文件放在 Tomcat 的 lib
文件夹中,并且它有效。我能够访问我的应用程序中的所有页面。
但我不想对 Tomcat 本身进行更改,而是想通过仅对我的项目进行更改来解决问题。
在您的情况下,
XMLInputFactory
是从Common
类加载器固定的。您可以阅读有关 Tomcat 的类加载器操作方法 的更多信息。由于您无法更改 Jasper 编译器的位置,或者只能提供 Jasper 嵌入工件。从属性文件中搜索类路径以获取其他类。