Jakarta ee IBM WebSphere Application Server上WebJAR的静态资源不可见

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

我正在使用部署到IBMWebSphereApplicationServer的JAX-RS和AngularJS编写一个简单的报告web应用程序。因为它非常简单,所以我尽量保持尽可能少的依赖关系,所以我不使用任何花哨的服务器端框架

为了提供静态资源,我编写了这个控制器。我将它们保存在
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
    方法声明中使用的
    ClassLoader
    在其类路径中包含所有Webjar
  • ClassLoader
    的实现是
    com.ibm.ws.ClassLoader.CompoundClassLoader
  • META-INF/resources
    文件夹中WebJars中的所有资源对
    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();
}