Jakarta ee IBM WebSphere Application Server上WebJAR的静态资源不可见
我正在使用部署到IBMWebSphereApplicationServer的JAX-RS和AngularJS编写一个简单的报告web应用程序。因为它非常简单,所以我尽量保持尽可能少的依赖关系,所以我不使用任何花哨的服务器端框架 为了提供静态资源,我编写了这个控制器。我将它们保存在Jakarta ee IBM WebSphere Application Server上WebJAR的静态资源不可见,jakarta-ee,websphere,classloader,websphere-8,webjars,Jakarta Ee,Websphere,Classloader,Websphere 8,Webjars,我正在使用部署到IBMWebSphereApplicationServer的JAX-RS和AngularJS编写一个简单的报告web应用程序。因为它非常简单,所以我尽量保持尽可能少的依赖关系,所以我不使用任何花哨的服务器端框架 为了提供静态资源,我编写了这个控制器。我将它们保存在src/main/resources文件夹中 @Path(“/”) 公共类资产{ @得到 @路径(“{Path:.\\\.js}”) 公共响应javascript(@PathParam(“路径”)字符串resourceN
src/main/resources
文件夹中
@Path(“/”)
公共类资产{
@得到
@路径(“{Path:.\\\.js}”)
公共响应javascript(@PathParam(“路径”)字符串resourceName){
返回ServerSource(resourceName,“应用程序/javascript”);
}
专用响应服务器资源(字符串资源名称、字符串内容类型){
输入流输入流=
getClass().getClassLoader().getResourceAsStream(resourceName);
返回响应。ok(inputStream)
.header(HttpHeaders.CONTENT\u类型,contentType)
.build();
}
}
到目前为止还不错
由于我使用了几个JavaScript库(jQuery、下划线.js、AngularJS),所以我想利用。根据webjars.org上的信息:
对于任何与Servlet 3兼容的容器
WEB-INF/lib
目录将自动作为静态目录提供
资源。这是因为META-INF/resources
WEB-INF/lib
中JAR中的目录自动公开为静态目录
资源
当我将相应的webjar放入我的pom.xml
中时,事情就停止了。这是我到目前为止发现的:
- 当然,WebJAR出现在
文件夹中生成的WEB-INF/lib
包中.war
- 在my
方法声明中使用的ServerSource
在其类路径中包含所有WebjarClassLoader
的实现是ClassLoader
com.ibm.ws.ClassLoader.CompoundClassLoader
文件夹中WebJars中的所有资源对META-INF/resources
都不可见。没有ClassLoader
如何让类加载器看到WebJAR中的资源?对于从JAR
META-INF/resources
提供文件,您需要WebSphereV8.5
查看本页了解更多详细信息- 使用以下方法查找静态文件:
URL ServletContext.getResource(String path)
Set ServletContext.getResourcePaths(String path)
WEB-INF/Lib下的META-INF/resources片段目录
应用程序WAR文件中的目录
在搜索预片段文档根之后,web容器搜索web片段。web片段包含一个JAR文件
应用程序WEB-INF/lib目录。JAR可能包含静态
在中定义的META-INF/resources目录中的资源
JAR文件。阻止web容器搜索的步骤
META-INF/resources目录,设置
com.ibm.ws.webcontainer.skipMetainResourceProcessing
web容器
自定义属性设置为true。自定义属性的默认值为
false
com.ibm.ws.webcontainer.SkipMetaInfResourcesProcessing = true
更新尝试将方法更改为以下内容(伪代码,无异常处理):
请参见和谢谢。我的依赖项中没有
ServletContext
类(它实际上是一个非常简单的应用程序)。有办法绕过它吗?如果没有,我应该添加什么依赖关系?@KarelSmutný用示例代码更新了答案。依赖关系应该在JavaEEAPI6.0上。
public Response javascript(@PathParam("path") String resourceName,
@Context ServletContext servletContext) {
// make sure resource name starts with / and should be relative path to META-INF/resources
URL url = serveltContext.getResource(resourceName);
InputStream inputStream = url.openStream();
return Response.ok(inputStream)
.header(HttpHeaders.CONTENT_TYPE, "application/javascript")
.build();
}