来自IBM WebSphere Application Server上的WebJars的静态资源不可见

时间:2014-10-06 09:45:51

标签: java-ee websphere classloader websphere-8 webjars

我正在使用部署到IBM WebSphere Application Server的JAX-RS和AngularJS编写一个简单的报表Web应用程序。因为它非常简单,所以我尽量保持尽可能少的依赖,所以我没有使用任何花哨的框架服务器端。

为了提供静态资源,我写了这个控制器。我将它们保存在src/main/resources文件夹中。

@Path("/")
public class Assets {

    @GET
    @Path("{path:.*\\.js}")
    public Response javascript(@PathParam("path") String resourceName) {
        return serveResource(resourceName, "application/javascript");
    }

    private Response serveResource(String resourceName, String contentType) {
        InputStream inputStream =
            getClass().getClassLoader().getResourceAsStream(resourceName);

        return Response.ok(inputStream)
                .header(HttpHeaders.CONTENT_TYPE, contentType)
                .build();
    }
}

到目前为止一切顺利。

当我使用多个JavaScript库(jQuery,Underscore.js,AngularJS)时,我想使用WebJars。根据webjars.org上的documentation

  

使用任何与Servlet 3兼容的容器,其中包含WebJars   WEB-INF/lib目录自动以静态方式提供   资源。这是有效的,因为META-INF/resources中的任何内容都有效   WEB-INF/lib中JAR中的目录会自动显示为静态   资源。

当我将相应的WebJars放入我的pom.xml时,事情就停止了。这是我到目前为止所发现的:

  • WebJars当然存在于.war文件夹中生成的WEB-INF/lib包中。
  • 我在ClassLoader方法声明中使用的
  • serveResource在其类路径中包含所有WebJars。
  • ClassLoader的实施是com.ibm.ws.classloader.CompoundClassLoader
  • META-INF/resources文件夹中WebJars中的所有资源都不可见ClassLoader。无。

如何让类加载器查看WebJars中的资源?

1 个答案:

答案 0 :(得分:1)

对于通过JAR META-INF/resources投放文件,您需要WebSphere v8.5 查看此页面了解更多详情 - Web container configuration for JavaServer Pages static file access

使用以下方法查找静态文件:

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.SkipMetaInfResourcesProcessing网络容器   自定义属性为true。自定义属性的默认值为   false

com.ibm.ws.webcontainer.SkipMetaInfResourcesProcessing = true

<强>更新
尝试将您的方法更改为此类(伪代码,无异常处理):

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();
}

请参阅ServletContext.getResourceURL.openStream