启动时在 tomcat 9 上部署大型 WAR 文件时出错

启动时在 tomcat 9 上部署大型 WAR 文件时出错

JRE版本:1.8.0_191-b12 Tomcat版本:9.0.13 Windows 10

我有一个大型 WAR 文件(300MB),其中包含数百个文件、类、struts 操作等。

当我从 Windows 服务启动 Tomcat 9.0.13 时,尝试通过 URL 访问该应用程序时出现以下错误:

21-Nov-2018 12:49:42.544 SEVERE [http-nio-9090-exec-1] org.apache.catalina.core.StandardHostValve.invoke Exception Processing /workflow/
 java.lang.SecurityException: AuthConfigFactory error: java.lang.reflect.InvocationTargetException
    at javax.security.auth.message.config.AuthConfigFactory.getFactory(AuthConfigFactory.java:85)
    at org.apache.catalina.authenticator.AuthenticatorBase.findJaspicProvider(AuthenticatorBase.java:1239)
    at org.apache.catalina.authenticator.AuthenticatorBase.getJaspicProvider(AuthenticatorBase.java:1232)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:791)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    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)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at javax.security.auth.message.config.AuthConfigFactory$1.run(AuthConfigFactory.java:76)
    at javax.security.auth.message.config.AuthConfigFactory$1.run(AuthConfigFactory.java:67)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.message.config.AuthConfigFactory.getFactory(AuthConfigFactory.java:66)
    ... 17 more
Caused by: java.lang.SecurityException: org.xml.sax.SAXNotRecognizedException: Feature: http://apache.org/xml/features/allow-java-encodings
    at org.apache.catalina.authenticator.jaspic.PersistentProviderRegistrations.loadProviders(PersistentProviderRegistrations.java:65)
    at org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl.loadPersistentRegistrations(AuthConfigFactoryImpl.java:345)
    at org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl.<init>(AuthConfigFactoryImpl.java:68)
    ... 25 more
Caused by: org.xml.sax.SAXNotRecognizedException: Feature: http://apache.org/xml/features/allow-java-encodings
    at org.apache.crimson.parser.XMLReaderImpl.setFeature(XMLReaderImpl.java:213)
    at org.apache.crimson.jaxp.SAXParserImpl.setFeatures(SAXParserImpl.java:143)
    at org.apache.crimson.jaxp.SAXParserImpl.<init>(SAXParserImpl.java:126)
    at org.apache.crimson.jaxp.SAXParserFactoryImpl.newSAXParserImpl(SAXParserFactoryImpl.java:113)
    at org.apache.crimson.jaxp.SAXParserFactoryImpl.setFeature(SAXParserFactoryImpl.java:141)
    at org.apache.tomcat.util.digester.Digester.setFeature(Digester.java:505)
    at org.apache.catalina.authenticator.jaspic.PersistentProviderRegistrations.loadProviders(PersistentProviderRegistrations.java:61)
    ... 27 more

如果我等待大约 2 分钟,一切都会开始正常工作。Tomcat 8 过去会给我一个很好的错误页面,说资源尚未准备好,但 Tomcat 9 只显示这个堆栈跟踪。

有没有办法让 tomcat 9 做同样的事情?如果特定上下文尚未准备好,则返回格式良好的错误页面?

在此处输入图片描述

答案1

这是 Tomcat 部署大型 war 文件时的一个老问题。

https://tomcat.apache.org/tomcat-7.0-doc/deployer-howto.html#Deploying_on_a_running_Tomcat_server

部署应用程序有两种方法:1. 使用管理器应用程序,这绝对是一个不鼓励的选择(Web 表单通常会超时请求并超出大小配额)。

  1. 将 war 文件复制到 $CATALINA_HOME/webapps 目录。

第二个选项始终是首选选项。

然而,对于大文件来说,这也有一个问题:

复制大型文件需要一些时间,而部署守护程序所做的就是在正确复制大型 war 文件之前尝试解压它。可以通过移动大型 war 文件而不是复制它来避免这种情况:

// Instead of copy:
cp /tmp/mylarge-warfile.war $CATALINA_HOME/webapps/

// Simply move the war file to deploy dir:
mv /tmp/mylarge-warfile.war $CATALINA_HOME/webapps/

答案2

引发此问题的原因是在 Web 应用程序中安装了旧的 XML 解析器(如 Crimson)。虽然有时非常老的 Java 版本需要这样做,但对于任何较新的版本(我认为至少是最近 5 年左右 - 可能最早是最近 15 年左右),这应该不是必需的。

根本原因是 Tomcat 的 JASPIC 实现假定该allow-java-encodings功能始终可用。现在这个问题(终于)得到了解决引起 Tomcat 提交者的注意我们将修复 Tomcat,使其不再做出此假设。修复将在 2021 年 9 月以后的版本中进行。

相关内容