Веб-ресурсы сервлетов из библиотеки jar (Jetty) - PullRequest
0 голосов
/ 02 мая 2019

Мне известны подобные вопросы здесь и здесь .И все же ИМХО проблема еще не полностью покрыта, или, по крайней мере, она все еще не работает гладко для меня: (

Зачем это нужно:

Я хотел бы создать упакованную библиотеку JAR, который будет использоваться как общий компонент в нескольких WebApps, включая в себя логику сервера и соответствующий пользовательский интерфейс (веб-компоненты). Подумайте о UserService, предоставляющем сервлет / ресурс для вызовов login и signupсо стороны сервера, имея компоненты пользовательского интерфейса для комплексного решения для любого WebApp во всей экосистеме со стороны клиента.

Пока:

Похоже, это требование точнорассматривается в спецификации Servlet 3.0, имеющей дело с веб-ресурсами сервлетов, найденными в JAR-файлах по пути META-INF/resources.

Я, похоже, сделал именно так, как было сказано, структурируя ui-components.jar с META-INF/resources/ui-commons/... подкорень и настройка следующего в web.xml:

<servlet>
    <servlet-name>ui-commons</servlet-name>
    <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
    <init-param>
        <param-name>relativeResourceBase</param-name>
        <param-value>/WEB-INF/lib/ui-components.jar!META-NF/resources</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>ui-commons</servlet-name>
    <url-pattern>/ui-commons/*</url-pattern>
</servlet-mapping>

Это определение приходит до определения сервлета по умолчанию, обслуживающего остальные регистрыUlar WebApp ресурсы, как обычно, обнаруживаются в WAR.

И все же любой запрос ресурсов в этом JAR заканчивается 404.

Версия сервлета - 3.1.

.Jetty 9.4.

Это НЕ встроенная Jetty, ничего особенного, но, пожалуйста, обратите внимание на примечание, касающееся плагина maven.

Примечание:

Это может как-тобыть связан с тем фактом, что я сейчас пытаюсь запустить всю эту установку с jetty-maven-plugin, который обслуживает ресурсы из источников.

  • Я пытался опустить указанный JAR в src/main/resources/WEB-INF/lib... вручную - безуспешно

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Пропустить <servlet> записи полностью.

Убедитесь, что ваш дескриптор <web-app> установлен на Servlet 3.0 или новее.

Пример (для сервлета 3.1)

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
</web-app>

Вы ДОЛЖНЫ разрешить расширение / распаковку военных файлов. (по умолчанию установлено значение true. Если вы объявляете его ложным в развертываемой контекстной конфигурации ${jetty.base}/webapps/<name>.xml, DeploymentManager или WebAppProvider, затем верните ее в значение true)

Убедитесь, что вы используете Jetty 9.2 или новее.

Есть пример проекта, демонстрирующего поведение META-INF/resources и jetty-maven-plugin в ...

https://github.com/jetty-project/jetty-example-metainf-resources

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

Если вы используете встроенный причал, знайте, что это будет работать только с WebAppContext, а не с ServletContextHandler.

0 голосов
/ 04 мая 2019

Хорошо, я что-то упустил, и ответ Джоакима указал мне правильное направление, чтобы найти это.

Чтобы получить ресурсы из JAR-файлов, которые будут обслуживаться Jetty, они в первую очередь должны быть сканирован сервером Jetty.

По умолчанию все JAR-файлы в WEB-INF/lib веб-приложения сканируются.Тем не менее, рекомендуется точно настроить это поведение и отфильтровать все несоответствующие JAR-файлы, чтобы ускорить время запуска согласно документации Jetty здесь .

Итак, сначала - обязательнопросмотрите конфигурацию атрибута WebInfIncludeJarPattern в настройке WebAppContext и включите JAR, который содержит дополнительные статические ресурсы.

Остальные настройки для «чужих» ресурсов JAR (опять же,как отметил Йоаким), он идентичен ресурсам обычного веб-приложения, и мне не нужен какой-либо специальный путь в JAR, как я ошибочно пытался сделать в своей первоначальной настройке.

...