Ошибка при развертывании большого файла WAR на tomcat 9 при запуске

Версия JRE:1.8.0_191-b12 Версия Tomcat: 9.0.13 Windows 10

У меня большой WAR-файл (300 МБ), несколько сотен файлов, классов, действий Struts и т. Д.

Когда я запускаю Tomcat 9.0.13 из службы Windows, я получаю следующую ошибку при попытке доступа к приложению через 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 сделать то же самое? Вернуть красиво отформатированную страницу ошибки, если конкретный контекст еще не готов?

2 ответа

Это старая проблема, связанная с проблемой развертывания Tomcat с большими военными файлами.

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

Существует два способа развертывания приложения: 1. Используйте приложение менеджера, что является абсолютно нежелательным вариантом (веб-форма обычно запрашивает тайм-аут и превышает размер квоты).

  1. Скопируйте файл war в каталог $CATALINA_HOME/webapps.

Второй вариант - это предпочтительные варианты всегда.

Однако с большими файлами это также имеет проблему:

Копирование большого файла занимает некоторое время, и демон развертывания пытается разархивировать большой военный файл до его правильного копирования. Этого можно избежать, переместив большой файл войны вместо того, чтобы справиться с ним:

// 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/

Причиной этой проблемы является добавление в веб-приложение старого анализатора XML (например, Crimson). Хотя это иногда требовалось для очень старых версий Java, для любой отдаленно недавней версии (я думаю, по крайней мере, за последние 5 лет или около того - возможно, даже за последние 15 лет или около того) в этом нет необходимости.

Основная причина заключается в том, что реализация JASPIC в Tomcat предполагает, чтоallow-java-encodingsфункция всегда доступна. Теперь эта проблема (наконец-то) была доведена до сведения коммиттеров Tomcat, и мы исправим Tomcat, чтобы он больше не делал подобных предположений. Исправления будут в выпусках начиная с сентября 2021 года.

Другие вопросы по тегам