来自库 jar (Jetty) 的 Servlet Web 资源
Servlet web resources from library jar (Jetty)
我知道类似的问题 and here。然而恕我直言,这个问题还没有完全解决,或者至少对我来说它仍然不能顺利工作:(
需要什么:
我想构建一个 JAR 打包库,它将在多个 Web 应用程序中用作共享组件,将服务器逻辑以及相关的 UI(网络组件)引入其中。从服务器端的角度考虑 UserService
为 login
和 signup
调用提供 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
相关,后者从源提供资源。
- 我尝试手动将上述 JAR 放入
src/main/resources/WEB-INF/lib...
- 没有成功
完全跳过 <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>.xml
、DeploymentManager
配置或 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,因为我曾错误地尝试过在我的初始设置中执行。
我知道类似的问题
需要什么:
我想构建一个 JAR 打包库,它将在多个 Web 应用程序中用作共享组件,将服务器逻辑以及相关的 UI(网络组件)引入其中。从服务器端的角度考虑 UserService
为 login
和 signup
调用提供 servlet/resource,同时为任何端到端解决方案提供 UI 组件从客户端看整个生态系统中的WebApp。
到目前为止:
似乎 Servlet 3.0 规范中的一项功能恰好解决了此要求,该功能处理在路径 META-INF/resources
.
我似乎完全按照它说的做了,在根目录下构建具有 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...
- 没有成功
完全跳过 <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>.xml
、DeploymentManager
配置或 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.
因此,首先 - 请务必在 WebAppContext
设置中查看您的 WebInfIncludeJarPattern
属性配置,并包含包含额外静态资源的 JAR。
'foreign' JAR 资源的其余设置(同样,正如 Joakim 所指出的)与常规 Web 应用程序的资源相同,不需要任何特殊路径进入 JAR,因为我曾错误地尝试过在我的初始设置中执行。