Ошибка при развертывании большого файла 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. Используйте приложение менеджера, что является абсолютно нежелательным вариантом (веб-форма обычно запрашивает тайм-аут и превышает размер квоты).
- Скопируйте файл 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 года.