Что делать с аннотациями после установки метаданных-complete = "true" (которые разрешили медленный запуск Tomcat 7)?
Похоже, что медленная проблема запуска Tomcat 7 может быть решена с помощью "metadata-complete", установленного в "true" в web.xml, например:
<?xml version="1.0" encoding="UTF-8"?>
<web-app metadata-complete="true" id="WebApp_ID" version="3.0"...
Проблема заключается в том, что Tomcat сканирует аннотации при запуске, и это значительно замедляет работу. Мое время сокращается с 25 секунд до 5 секунд. (Подробнее здесь: Веб-настройка Tomcat и Servlet 3.0)
Однако у меня есть некоторые аннотации в моем коде, например:
@ManagedBean
@RequestScoped
@Override
...
Я запутался - будет ли мой код работать после того, как я установил метаданные-complete = "true"? Нужно ли удалять аннотации и переместить все в web.xml?
Ответы
Ответ 1
Медленный запуск вызван тем, что каждый отдельный файл класса в каждом отдельном файле JAR в /WEB-INF/lib
также сканируется для специальных аннотаций сервлета 3.0. У вас, видимо, много (больших) JAR файлов в /WEB-INF/lib
.
metadata-complete="true"
указывает, что файлы JAR в /WEB-INF/lib
не нужно сканировать для специальных аннотаций сервлета 3.0, но собственные классы webapp все еще будут проверяться.
Обратите внимание, что вы указали там две аннотации JSF и одну аннотацию Java SE, а не аннотации сервлетов 3.0. Аннотации Servlet 3.0 перечислены в пакете javax.servlet.annotation
. JSF будет сканировать только аннотации, когда файл JAR содержит файл /META-INF/faces-config.xml
, совместимый с JSF 2.0. Он не будет сразу сканировать каждый отдельный класс в каждом файле JAR. Аннотации Java SE @Override
не является аннотацией во время выполнения, а только средством для компиляции.
См. также:
Ответ 2
Вот что такое Java Servlet 3.0/3.1 Спецификация должен сказать:
Дескриптор развертывания веб-приложения содержит метаданные, полныеатрибут в элементе веб-приложения. Атрибут метаданных - полныйопределяет, завершен ли дескриптор web.xml, или другой Источники метаданных, используемые процессом развертывания, должны быть считается. Метаданные могут быть получены из файла web.xml, web-fragment.xmlфайлы, аннотации в файлах классов в WEB-INF/classes и аннотации на классы в файлах jar в каталоге WEB-INF/lib. Если metadata-complete установлено значение "true", инструмент развертывания только проверяет файла web.xml и должны игнорировать аннотации, такие как @WebServlet, @WebFilter и @WebListener, присутствующих в файлах классов приложения, а также должен игнорировать любой дескриптор web-fragment.xmlупакован в файл jar в WEB-INF/lib. Если metadata-completeатрибут не указан или установлен в значение "false", средство развертывания должен проверять файлы классов и файлы web-fragment.xml для метаданные, как указано ранее.
Это будет сказано и ответить на ваш вопрос: Да, чтобы оптимизировать время запуска Tomcat, вам нужно использовать metadata-complete="true"
и поместить каждый сервлет или фильтр или прослушиватель в дескриптор развертывания.