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

时间:2019-05-02 14:25:36

标签: java servlets jar resources jetty

我知道类似的问题herehere。但是恕我直言,这个问题尚未完全解决,或者至少对我来说仍然无法顺利进行:(

需要什么?

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

到目前为止:

Servlet 3.0规范中的功能处理了在JAR中位于路径META-INF/resources下的servlet Web资源,从而恰好满足了这一要求。

我似乎完全按照它说的做,构造了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>

此定义之前出现在默认的Servlet定义之前,该servlet定义照常服务于WAR中的其余常规Web应用程序资源。

但是,该JAR中对资源的任何请求都以404结尾。

Servlet版本为3.1

码头9.4

它不是嵌入式Jetty,没什么花哨的,但是请注意以下有关Maven插件的通知。

注意:

这可能与以下事实有关:我当前正在尝试使用jetty-maven-plugin来运行整个安装程序,该服务正在从源中提供资源。

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

2 个答案:

答案 0 :(得分:1)

完全跳过<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

答案 1 :(得分:0)

好吧,我错过了一些东西,乔亚金(Joakim)的回答为我指明了正确的方向。

为了从Jetty服务的JAR中获取资源,首先,应该首先由Jetty服务器对其进行扫描。

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

因此,首先-确保在WebInfIncludeJarPattern设置中检查您的 WebAppContext 属性配置,并包括包含额外静态资源的JAR。

“外国” JAR资源的其余设置(再次,如Joakim所指出的)与常规Webapp的资源相同,不需要任何特殊的JAR路径,因为我在我的尝试中做错了初始设置。