Причал 8: может ли веб-фрагмент кувшина /мета-инф/ресурсов/веб-инф/классы каталог содействовать классов веб-приложения?


Я создал сервлет 3.0 web fragment jar, который содержит файл:

/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.утиль.MissingResourceException: не удается найти пакет для базового имени com.foo.что угодно.i18n, locale en_US

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

1 3

1 ответ:

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

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

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

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

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

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