来自库 jar (Jetty) 的 Servlet Web 资源

Servlet web resources from library jar (Jetty)

我知道类似的问题 and here。然而恕我直言,这个问题还没有完全解决,或者至少对我来说它仍然不能顺利工作:(

需要什么:

我想构建一个 JAR 打包库,它将在多个 Web 应用程序中用作共享组件,将服务器逻辑以及相关的 UI(网络组件)引入其中。从服务器端的角度考虑 UserServiceloginsignup 调用提供 servlet/resource,同时为任何端到端解决方案提供 UI 组件从客户端看整个生态系统中的WebApp。

到目前为止:

似乎 Servlet 3.0 规范中的一项功能恰好解决了此要求,该功能处理在路径 META-INF/resources.

下的 JAR 中找到的 servlet Web 资源

我似乎完全按照它说的做了,在根目录下构建具有 META-INF/resources/ui-commons/...ui-components.jar 并在 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>

此定义出现在默认 servlet 定义之前,照常服务于 WAR 中找到的其余常规 WebApp 资源。

然而,对该 JAR 中的资源的任何请求都以 404 结束。

Servlet 版本为 3.1

码头9.4.

它不是嵌入式Jetty,没什么特别的,但是请注意下面关于maven插件的通知。

通知:

这可能与我目前正在尝试 运行 整个设置与 jetty-maven-plugin 相关,后者从源提供资源。

完全跳过 <servlet> 个条目。

确保您的 <web-app> 描述符设置为 Servlet 3.0 或更新版本。

示例(对于 Servlet 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>

您必须允许 war 文件展开/提取。 (默认情况下设置为 true。如果您在上下文可部署 ${jetty.base}/webapps/<name>.xmlDeploymentManager 配置或 WebAppProvider 配置中将其声明为 false,则将其恢复为 true)

确保您使用的是 Jetty 9.2 或更新版本。

有一个示例项目演示了 META-INF/resources 行为和 jetty-maven-plugin 在...

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

就是这样,默认支持。无需额外工作。 (除非你自己用嵌入式码头做事)

如果使用嵌入式码头,请注意这仅适用于 WebAppContext,不适用于 ServletContextHandler

好的,我漏掉了一些东西,Joakim 的回答为我指明了正确的方向。

为了从 JAR 中获取资源以供 Jetty 使用,它们首先应该被 Jetty 服务器扫描

默认情况下,会扫描 webapp WEB-INF/lib 中的所有 JAR。然而,建议根据 Jetty 的文档 here.

微调此行为并过滤掉所有不相关的 JAR 以加快启动时间

因此,首先 - 请务必在 WebAppContext 设置中查看您的 WebInfIncludeJarPattern 属性配置,并包含包含额外静态资源的 JAR。

'foreign' JAR 资源的其余设置(同样,正如 Joakim 所指出的)与常规 Web 应用程序的资源相同,不需要任何特殊路径进入 JAR,因为我曾错误地尝试过在我的初始设置中执行。