【问题标题】:Servlet web resources from library jar (Jetty)来自库 jar (Jetty) 的 Servlet Web 资源
【发布时间】:2019-09-21 02:26:06
【问题描述】:

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

需要什么:

我想构建一个 JAR 打包库,它将像多个 WebApp 中的共享组件一样使用,在其中引入服务器逻辑以及相关的 UI(Web 组件)。想一想 UserService 从服务器端的角度为 loginsignup 调用提供 servlet/资源,同时从客户端为整个生态系统中的任何 WebApp 提供端到端解决方案的 UI 组件。

到目前为止:

似乎这个要求完全由 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 运行整个设置这一事实有关,它正在从源中提供资源。

  • 我已尝试手动将上述 JAR 放入 src/main/resources/WEB-INF/lib... - 没有成功

【问题讨论】:

    标签: java servlets jar resources jetty


    【解决方案1】:

    完全跳过&lt;servlet&gt; 条目。

    确保您的 &lt;web-app&gt; 描述符设置为 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>
    

    您必须允许战争文件展开/提取。 (默认设置为 true。如果您在可部署的${jetty.base}/webapps/&lt;name&gt;.xmlDeploymentManager 配置或WebAppProvider 配置中将其声明为 false,则将其恢复为 true)

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

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

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

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

    如果使用嵌入式码头,请知道这仅适用于 WebAppContext,而不适用于 ServletContextHandler

    【讨论】:

    • 用 servlet 和 Jetty 版本更新了 Q,一切正确。跳过servlet 是什么意思?首先,我确实需要默认的 servlet 来提供其他静态信息。还有...... Jetty 如何找到正确的 JAR 来从中挑选资源?和相对路径?
    • 跳过,如不使用,如从您的web.xml 中删除。 DefaultServlet 通过默认描述符提供给所有 webapps,使用 WebAppContext 时无需手动声明。
    • 如果我想调整 DefaultServlet 行为,如缓存控制、etags、不允许目录列表等,&lt;servlet&gt; 条目是正确的方法(假设不涉及 Java 代码) ?
    【解决方案2】:

    好的,我错过了一些东西,Joakim 的回答为我指明了找到它的正确方向。

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

    默认情况下,webapp 的 WEB-INF/lib 中的所有 JAR 都会被扫描。但是,建议根据 Jetty 的文档 here 微调此行为并过滤掉所有不相关的 JAR 以加快启动时间。

    因此,首先 - 请务必检查 WebAppContext 设置中的 WebInfIncludeJarPattern 属性配置,并包含包含其他静态资源的 JAR。

    “外部”JAR 资源的其余设置(同样,正如 Joakim 指出的那样)与常规 webapp 的资源相同,不需要任何特殊路径进入 JAR,因为我在我的初始设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 2016-08-20
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多