Что делать с аннотациями после установки metadata-complete = "true" (что разрешило медленный запуск Tomcat 7)? - PullRequest
40 голосов
/ 22 марта 2012

Похоже, что проблема медленного запуска 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
...

Я в замешательстве - будетмой код работает после того, как я установил metadata-complete = "true"?Нужно ли удалять аннотации и перемещать все в web.xml?

Ответы [ 2 ]

68 голосов
/ 22 марта 2012

Медленный запуск вызван тем, что каждый отдельный файл класса в каждом отдельном файле JAR в /WEB-INF/lib также сканируется на наличие конкретных примечаний Servlet 3.0.Очевидно, у вас есть много (больших) JAR-файлов в /WEB-INF/lib.

. metadata-complete="true" означает, что JAR-файлы в /WEB-INF/lib не нужно сканировать для конкретных аннотаций Servlet 3.0, ноСобственные классы webapp по-прежнему будут сканироваться.

Обратите внимание, что вы перечислили там две аннотации JSF и одну аннотацию Java SE, а не аннотации Servlet 3.0.Аннотации Servlet 3.0 перечислены в пакете javax.servlet.annotation.JSF будет сканировать аннотации только в том случае, если файл JAR содержит файл /META-INF/faces-config.xml, совместимый с JSF 2.0.Он не будет сразу сканировать каждый класс в каждом файле JAR.Java SE @Override - это не аннотация времени выполнения, а только вспомогательная информация во время компиляции.

См. Также:

12 голосов
/ 31 января 2015

Вот что сервлет Java 3.0 / 3.1 Спецификация должна сказать:

Дескриптор развертывания веб-приложения содержит метаданных, завершенных атрибут в элементе web-app . Атрибут полный метаданных определяет, завершен ли дескриптор web.xml или другой источники метаданных, используемые в процессе развертывания, должны быть считается. Метаданные могут поступать из файла web.xml , web-фрагмент.xml файлы, аннотации к файлам классов в WEB-INF / classes и аннотации на классах в jar-файлах в каталоге WEB-INF / lib . Если metadata-complete имеет значение «true», инструмент развертывания только проверяет файл web.xml и должен игнорировать аннотации, такие как @ WebServlet , @ WebFilter и @ WebListener , присутствующие в файлах классов приложения, а также должен игнорировать любой дескриптор web-фрагмент.xml упакован в файл jar в WEB-INF / lib . Если метаданные завершены атрибут не указан или имеет значение "false", инструмент развертывания необходимо проверить файлы классов и web-фрагмент.xml файлы для метаданные, как указано ранее.

Как говорится, и для ответа на ваш вопрос: Да, чтобы оптимизировать время запуска Tomcat, вам нужно использовать metadata-complete="true" и поместить каждый сервлет, фильтр или прослушиватель в дескриптор развертывания.

...