Мы недавно перешли на 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. пространство
(вызвано неэффективно реализованным процессором аннотаций Tomcat (кэшируется около 50 000 классов)).
Я знаю, что мы можем отключить поиск аннотаций в библиотеке, но, поскольку мы используем в основном сторонние продукты, у которых нет флага metadata-complete = "true"
, это тоже не так. опция.
Можно ли что-нибудь сделать, чтобы отключить поиск аннотаций? Или мы можем заставить контейнер сервлетов искать web-fragment.xml
только в объявленных библиотеках?
Я действительно хотел бы использовать новую функцию веб-фрагмента, но с увеличенным временем запуска и увеличенным объемом памяти это невозможно.