Используйте веб-фрагменты (Servlet API 3.0) в огромной среде проекта - PullRequest
7 голосов
/ 05 марта 2012

Мы недавно перешли на Servlet API 3.0. Поскольку мы разрабатываем структуру, которая иногда требует нескольких изменений в web.xml, проекты, основанные на нашей структуре, должны обновлять свои web.xml всякий раз, когда вносятся изменения в структуру.

Servlet API 3.0 представляет новые веб-фрагменты , которые делают это поведение более свободным и динамичным. Я создаю web-fragment.xml и перемещаю туда все наши материалы из web.xml. Таким образом, теперь проектам нужно только определить следующие web.xml и свои собственные дополнительные объявления.

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
   version="3.0"
   metadata-complete="false"
   xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
</web-app>

Мы должны использовать metadata-complete="false", чтобы включить поиск фрагментов в JAR-файлах (наша инфраструктура имеет web-fragment.xml в META-INF/.

Поскольку у нас много зависимостей от других платформ и библиотек (около 80-90), а metadata-complete="false" также запускает поиск аннотаций, для поиска во всех библиотеках может потребоваться недопустимое 12 секунд .

Механизм, как он есть, прекрасно работает, и мне нравится тот факт, что мы более оторваны от нашей среды, но время запуска фатально! Также нам нужно увеличить доступную память для Tomcat с -Xms256m -Xmx512m до -Xms512m -Xmx1024m, чтобы запустить ее без получения java.lang.OutOfMemoryError: Java heap space (вызвано неэффективно реализованным процессором аннотаций Tomcat (кэшируется около 50 000 классов)).


Я знаю, что мы можем отключить поиск аннотаций в библиотеке, но, поскольку мы используем в основном сторонних разработчиков, у которых нет флага metadata-complete="true", это также не вариант.

Можем ли мы что-нибудь сделать, чтобы отключить поиск аннотаций? Или мы можем заставить контейнер сервлетов искать только в объявленных библиотеках web-fragment.xml?

Мне бы очень хотелось использовать новую функцию веб-фрагментов, но с увеличенным временем запуска и памятью это невозможно.

Ответы [ 2 ]

3 голосов
/ 05 марта 2012

Вы можете отключить обработку аннотаций по конфигурации для определенных файлов JAR. Я использовал его только для файлов JAR, он может не работать для взорванных WAR s. Посмотрите на <tomcat>/conf/catalina.properties, строка 76 (Tomcat 7.0.22):

# List of JAR files that should not be scanned for configuration information
# such as web fragments, TLD files etc. It must be a comma separated list of
# JAR file names.
# The JARs listed below include:
# - Tomcat Bootstrap JARs
# - Tomcat API JARs
# - Catalina JARs
# - Jasper JARs
# - Tomcat JARs
# - Common non-Tomcat JARs
# - Sun JDK JARs
# - Apple JDK JARs
0 голосов
/ 04 марта 2014

В Tomcat есть некоторые системные свойства, которые позволяют управлять сканированием JAR с 7.0.30. Проверьте страницу документа здесь .

В основном это:

  • tomcat.util.scan.DefaultJarScanner.jarsToSkip
  • org.apache.catalina.startup.ContextConfig.jarsToSkip
  • org.apache.catalina.startup.TldConfig.jarsToSkip

Не уверен, какое самое раннее время вы можете их установить, может быть ContextListener?

...