从 Tomcat 9.0.87 迁移到 9.0.88 后,出现“com.ctc.wstx.stax.WstxInputFactory”的 ClassNotFoundException

问题描述 投票:0回答:1

我最近将我的 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 本身进行更改,而是想通过仅对我的项目进行更改来解决问题。

java struts2 migration classnotfoundexception tomcat9
1个回答
0
投票

在您的情况下,

XMLInputFactory
是从
Common
类加载器固定的。您可以阅读有关 Tomcat 的类加载器操作方法 的更多信息。由于您无法更改 Jasper 编译器的位置,或者只能提供 Jasper 嵌入工件。从属性文件中搜索类路径以获取其他类。

© www.soinside.com 2019 - 2024. All rights reserved.