Tomcat - не загрузит ли мой файл META-INF \ services \ javax.servlet.ServletContainerInitializer? - PullRequest
10 голосов
/ 08 октября 2011

У меня есть веб-проект, в котором есть файл \META-INF\services\javax.servlet.ServletContainerInitializer, содержимое которого указывает на полностью определенное имя класса, реализующего интерфейс ServletContainerInitializer.Я в основном следовал приведенному здесь примеру: http://nullhaus.com/2011/03/using-servlets-3-0-servletcontainerinitializer/

Я поместил строки отладки в мой класс, который реализует интерфейс ServletContainerInitializer, и он никогда не делает его там.Даже не конструктор по умолчанию ...

Структура папок моего приложения выглядит следующим образом:

\MyApp
      \META-INF\services\javax.servlet.ServletContainerInitializer
      \WEB-INF\classes\
                 ... [list of classes and packages go here]

Любые идеи, что мне нужно проверить ??

Примечание 1:Мой Tomcat публикует из разорванной внешней папки, в которой находится мое приложение

Примечание 2: Я запустил свой Tomcat из Eclipse - если это имеет значение!

Ответы [ 4 ]

5 голосов
/ 09 ноября 2011

Ну, я думаю, вам нужно будет обернуть ваш класс инициализатора (и его каталог META-INF, связанный со службами) в отдельный * .jar и поместить его в WEB-INF/lib.

Это служба JAR, поэтому я думаю, что это может быть связано с проблемами с обнаружением служб в * .war-файле. Более того, даже не поможет, если вы поместите каталог META-INF в WEB-INF/classes и установите unpackWAR=false в server.xml.

вашего Tomcat.

НТН.

3 голосов
/ 01 августа 2015

Чтобы tomcat мог загрузить каталог META-INF , он должен находиться в папке классов. Если вы используете проект maven, просто поместите каталог META-INF в каталог src / main / resources .. в пакете mvn то же самое будет скопировано в каталог классов .. Нет необходимости в отдельном jar .. если баночка предпочтительнее, вы можете использовать HandlesTypes аннотация ..

3 голосов
/ 19 октября 2011

Первое, что нужно проверить, это то, что вы на самом деле используете Servlet 3.0, а не более раннюю версию. Для Tomcat это означает, что вы должны использовать Tomcat 7.0.22

Во-вторых, убедитесь, что файл \ META-INF \ services \ javax.servlet.ServletContainerInitializer действительно существует в разобранном файле войны.

В-третьих, если вы сомневаетесь, настройте и запустите Tomcat напрямую (не из Eclipse) - я видел, что у разработчиков бесконечные проблемы с настройкой Tomcat с использованием плагина Eclipse.

1 голос
/ 02 августа 2018

Я хотел бы привести хорошее объяснение из Mark Thomas <markt@apache.org>, приведенное в списке рассылки пользователей Tomcat:

Сервисные файлы загружаются загрузчиками классов из каталога META-INF / services.

*. Jar! / META-INF / services и * .war / WEB-INF / classes / META-INF / services видны загрузчикам классов

*. War! / META-INF/ services не является.

Группа экспертов по сервлетам недавно обсуждала WAR vs JAR в контексте Java 9 и мультиверсионных JAR.Был сделан вывод (я перефразирую), что WAR не являются специализированной формой JAR, и хотя они имеют общий формат, функция, доступная для JAR, НЕ автоматически доступна для WAR, если только не спецификация Servlet (спецификация Java EE)прямо указано иное.

Контейнеры могут свободно добавлять специфичные для контейнера расширения, если они этого пожелают, но они приходят с обычными (отсутствующими) предупреждениями о совместимости.

http://mail -archives.apache.org/mod_mbox/tomcat-users/201808.mbox/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...