Jetty 8: может ли каталог /META-INF/resources/WEB-INF/classes jar веб-фрагмента способствовать пути к классам веб-приложения?

Я создал банку веб-фрагментов Servlet 3.0, содержащую файл:

/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, языковой стандарт en_US

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


person Les Hazlewood    schedule 21.01.2015    source источник
comment
То, что Tomcat разрешает это по умолчанию, является ошибкой. Эта ошибка будет исправлена ​​в следующем релизе. Если вам нужна эта функция, то должно быть возможно восстановить эквивалентное поведение с конкретной конфигурацией Tomcat.   -  person Mark Thomas    schedule 22.01.2015


Ответы (1)


В спецификации сервлета нет ничего, что указывало бы на то, что файл jar внутри WEB-INF/lib может вносить классы в путь к классам с помощью этого метода. Спецификация говорит о том, что файлы 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», пункт 4, стр. A-202.

В других местах спецификации он относится к каталогам WEB-INF и WEB-INF/classes (т.е. в единственном числе).

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

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

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

с уважением Ян

person Jan    schedule 22.01.2015
comment
Отличный ответ Ян - спасибо! Я действительно поместил файл в «нормальное» расположение пути к классам jar, т.е. хорошо). - person Les Hazlewood; 23.01.2015