2015-01-21 4 views
3

Я создал Servlet 3.0 веб-фрагмент банку, который содержит файл:Jetty 8: может ли каталог веб-фрагмента jar's/META-INF/resources/WEB-INF/classes вносить вклад в путь класса веб-приложения?

/META-INF/resources/WEB-INF/classes/com/foo/whatever/i18n.properties

Один из контекста сервлета Приёмников обеспечиваемых веб-фрагмента при запуске приложения выполняет следующий код:

public static final String BUNDLE_BASE_NAME = "com.foo.whatever.i18n"; 
//... later: 
ResourceBundle.getBundle(BUNDLE_BASE_NAME, locale); 

Это означает, что файл веб-фрагмента выше i18n.properties должен использоваться, если конечный пользователь не указывает свои собственные на том же пути в своем веб-приложении.

Это работает в Tomcat 7, но не в Jetty 8. Это результирующее исключение при развертывании в Jetty 8:

java.util.MissingResourceException: Не удается найти сверток для базового имени com.foo .whatever.i18n, locale en_US

Есть ли способ получить Jetty 8, чтобы почтить вклад в классовый путь веб-фрагмента?

+1

Это Tomcat действительно позволяет это по умолчанию является ошибкой. Эта ошибка будет исправлена ​​в следующем выпуске. Если вам нужна эта функция, тогда должно быть возможно восстановить эквивалентное поведение с конкретной конфигурацией Tomcat. –

ответ

5

В спецификации Servlet нет ничего, что указывало бы, что файл jar внутри WEB-INF/lib может вносить классы в путь к классам с помощью этого метода. Spec рассказывает о файлах jar в WEB-INF/lib, которые могут вносить статический контент через свой каталог META-INF/resources. Например, см. Раздел 4.6 «Ресурсы» стр. 4-41; Раздел 8.2.3 «Сборка дескриптора из web.xml, web-fragment.xml и аннотаций» пункт 2.5.g.xi стр. 8-81; Раздел 10.5 «Структура каталогов» стр. 10-104; Раздел 10.10 «Файлы приветствия» стр. 10-112; Раздел A.3 «Изменения с момента публикации Servlet 3.0 Public Review» 4 п. A-202.

В других местах в Spec это относится к каталогам WEB-INF и WEB-INF/classes.

В спецификации нет инструкций о том, как объединить каталог META-INF/resources/WEB-INF/с существующим WEB-INF/dir из основного webapp (т.е. должны ли классы в основном WEB-INF/классы dir переопределяют классы с тем же именем или пакетом в каталоге META-INF/resources/WEB-INF/classes или наоборот?). Принимая во внимание, что есть явные инструкции относительно того, что делать с ресурсами в ресурсах META-INF /, как я уже упоминал ранее.

Обратите внимание также, что спецификация позволяет игнорировать META-INF/web-fragment.xmls через механизм, но это НЕ влияет на загрузку классов: игнорируемый фрагмент фрагмента не будет проверяться аннотациями и не будет содержать никаких его ServletContainerInitializers, но его классы всегда будут находиться в пути к классам.

Итак, это, по-видимому, поведение, характерное для tomcat. Чтобы надежно получить ваш файл свойств, вам нужно будет поместить его в обычное место в банке WEB-INF/lib. Вы не можете использовать механизм web-fragment.xml Servlet Spec для контроля того, видимо ли этот файл свойств.

считает Jan

+0

Отличный ответ Ян - спасибо! Я действительно поместил файл в «нормальный» путь к кластеру jar, то есть my-plugin.jar: com/foo/whatever/i18n.properties и все работает так, как ожидалось, в Tomcat и Jetty (и я надеюсь, предположительно, в других контейнерах как Что ж). –