Вопрос или проблема
Версия JRE: 1.8.0_191-b12
Версия Tomcat: 9.0.13
Windows 10
У меня большой WAR файл (300 МБ) с несколькими сотнями файлов, классов, действий стратов и т.д.
Когда я запускаю Tomcat 9.0.13 из службы Windows, я получаю следующую ошибку, когда пытаюсь получить доступ к приложению через URL:
21-Nov-2018 12:49:42.544 СЕРЬЕЗНЫЙ [http-nio-9090-exec-1] org.apache.catalina.core.StandardHostValve.invoke Ошибка обработки /workflow/
java.lang.SecurityException: ошибка AuthConfigFactory: java.lang.reflect.InvocationTargetException
в javax.security.auth.message.config.AuthConfigFactory.getFactory(AuthConfigFactory.java:85)
в org.apache.catalina.authenticator.AuthenticatorBase.findJaspicProvider(AuthenticatorBase.java:1239)
в org.apache.catalina.authenticator.AuthenticatorBase.getJaspicProvider(AuthenticatorBase.java:1232)
в org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481)
в org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
в org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
в org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668)
в org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
в org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
в org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
в org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
в org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:791)
в org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417)
в org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
в java.util.concurrent.ThreadPoolExecutor.runWorker(Неизвестный источник)
в java.util.concurrent.ThreadPoolExecutor$Worker.run(Неизвестный источник)
в org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
в java.lang.Thread.run(Неизвестный источник)
Вызвано: java.lang.reflect.InvocationTargetException
в sun.reflect.NativeConstructorAccessorImpl.newInstance0(Нативный метод)
в sun.reflect.NativeConstructorAccessorImpl.newInstance(Неизвестный источник)
в sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Неизвестный источник)
в java.lang.reflect.Constructor.newInstance(Неизвестный источник)
в javax.security.auth.message.config.AuthConfigFactory$1.run(AuthConfigFactory.java:76)
в javax.security.auth.message.config.AuthConfigFactory$1.run(AuthConfigFactory.java:67)
в java.security.AccessController.doPrivileged(Нативный метод)
в javax.security.auth.message.config.AuthConfigFactory.getFactory(AuthConfigFactory.java:66)
... 17 больше
Вызвано: java.lang.SecurityException: org.xml.sax.SAXNotRecognizedException: Функция: http://apache.org/xml/features/allow-java-encodings
в org.apache.catalina.authenticator.jaspic.PersistentProviderRegistrations.loadProviders(PersistentProviderRegistrations.java:65)
в org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl.loadPersistentRegistrations(AuthConfigFactoryImpl.java:345)
в org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl.<init>(AuthConfigFactoryImpl.java:68)
... 25 больше
Вызвано: org.xml.sax.SAXNotRecognizedException: Функция: http://apache.org/xml/features/allow-java-encodings
в org.apache.crimson.parser.XMLReaderImpl.setFeature(XMLReaderImpl.java:213)
в org.apache.crimson.jaxp.SAXParserImpl.setFeatures(SAXParserImpl.java:143)
в org.apache.crimson.jaxp.SAXParserImpl.<init>(SAXParserImpl.java:126)
в org.apache.crimson.jaxp.SAXParserFactoryImpl.newSAXParserImpl(SAXParserFactoryImpl.java:113)
в org.apache.crimson.jaxp.SAXParserFactoryImpl.setFeature(SAXParserFactoryImpl.java:141)
в org.apache.tomcat.util.digester.Digester.setFeature(Digester.java:505)
в org.apache.catalina.authenticator.jaspic.PersistentProviderRegistrations.loadProviders(PersistentProviderRegistrations.java:61)
... 27 больше
Если я подожду около 2 минут, все начинает работать правильно. Tomcat 8 раньше выдавал красивую страницу ошибки, говоря, что ресурс еще не готов, но Tomcat 9 просто показывает этот трассировочный стек.
Есть ли способ сделать так, чтобы Tomcat 9 поступал так же? Возвращал красиво оформленную страницу ошибки, если конкретный контекст еще не готов?
Это старая проблема с развертыванием Tomcat с большими war-файлами.
https://tomcat.apache.org/tomcat-7.0-doc/deployer-howto.html#Deploying_on_a_running_Tomcat_server
Существует два способа развертывания приложения:
1. Использовать менеджер приложений, что абсолютно не рекомендуется (веб-форма обычно превышает время ожидания запросов и превышает квоты по размеру).
- Скопируйте файл war в каталог $CATALINA_HOME/webapps.
Второй вариант всегда предпочтителен.
Однако с большими файлами это также вызывает проблему:
Копирование большого файла занимает некоторое время, и то, что делает демон развертывания, это пытается распаковать большой war-файл до его правильного копирования. Это можно избежать, переместив большой war-файл вместо копирования его:
// Вместо копирования:
cp /tmp/mylarge-warfile.war $CATALINA_HOME/webapps/
// Просто переместите файл war в каталог развертывания:
mv /tmp/mylarge-warfile.war $CATALINA_HOME/webapps/
Причина этой проблемы – наличие устаревшего XML-парсера (например, Crimson) в веб-приложении. Хотя это иногда было необходимо с очень старыми версиями Java, с любыми более-менее современными версиями (я имею в виду, по меньшей мере последние 5 лет или около того – возможно, даже последние 15 лет) это не должно быть необходимо.
Коренная причина заключается в том, что реализация JASPIC Tomcat предполагает, что функция allow-java-encodings
всегда доступна. Теперь эта проблема (наконец) была доведена до сведения коммиттеров Tomcat, и мы исправим Tomcat так, чтобы он больше не делал это предположение. Исправления будут в релизах с сентября 2021 года и позже.
Ответ или решение
Ошибка при развертывании большого WAR-файла на Tomcat 9 при старте
При развертывании обширного WAR-файла (300 МБ) на Tomcat 9.0.13 можно столкнуться с несколькими проблемами, особенно если сервер работает через службу Windows. Рассмотрим основные шаги по диагностике и решению данной проблемы, а также предлагаемые улучшения для работы с Tomcat.
1. Анализ ошибки
Судя по предоставленному логу ошибок, основными проблемами, с которыми вы столкнулись, являются:
java.lang.SecurityException: AuthConfigFactory error: java.lang.reflect.InvocationTargetException
Caused by: org.xml.sax.SAXNotRecognizedException: Feature: http://apache.org/xml/features/allow-java-encodings
Эти ошибки указывают на проблемы с конфигурацией безопасности и взаимодействием с XML-парсерами. Выявлено, что использование устаревшего парсера XML (например, Crimson) в вашем приложении может стать причиной возникновения этих ошибок. Это связано с тем, что Tomcat ожидает, что поддержка определённых функций всегда будет доступна, и её отсутствие вызывает исключение.
2. Рекомендации по решению проблемы
-
Обновление парсеров XML
Убедитесь, что в вашем приложении не содержатся устаревшие парсеры XML. Вместо использования Crimson, рекомендуется использовать более современные парсеры, такие как Apache Xerces. Это поможет устранить конфликты, связанные с не поддерживаемыми функциями. -
Перемещение WAR-файла
При развертывании большого WAR-файла, вместо копирования файла в каталогwebapps
, переместите его. Это может помочь избежать проблем с разархивацией файла до того, как он будет полностью скопирован на сервер. Используйте команду:mv /path/to/mylarge-warfile.war $CATALINA_HOME/webapps/
Такой подход предотвратит частичное развертывание приложения, которое может привести к различным ошибкам при запуске.
-
Мониторинг времени запуска
Учитывая, что приложение начинает работать корректно через 2 минуты, возможно, имеет смысл настроить более длительные таймауты для процессов развертывания. Это можно сделать черезserver.xml
в разделе<Connector>
, задав параметрыconnectionTimeout
. -
Настройка обработки ошибок
Tomcat 9 по умолчанию не предоставляет полезные страницы ошибок при недоступности ресурсов. Для этого можно настроить кастомизированные страницы ошибок, добавив в файлweb.xml
вашего приложения следующие строки:<error-page> <error-code>404</error-code> <location>/error404.html</location> </error-page>
Это позволит вашему приложению отображать более дружелюбные страницы ошибок вместо стек-трейсов при возникновении исключений.
3. Заключение
Обработка большого WAR-файла требует более тщательного подхода к конфигурации среды развертывания. Следуйте рекомендациям, приведенным выше, и протестируйте изменения в тестовой среде, прежде чем внедрять их в ваш рабочий процесс. Это поможет минимизировать время простоя и улучшить качество обслуживания ваших приложений.
SEO-оптимизация
Для повышения видимости вашего вопроса и краткости изложения использованы ключевые слова, такие как "развертывание WAR-файла на Tomcat", "ошибка безопасности Tomcat", а также упоминания о настройках и конфигурациях. Это обеспечит лучшее восприятие информации как для поисковых систем, так и для пользователей.