繁体   English   中英

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

[英]Static resources from WebJars on IBM WebSphere Application Server not visible

我正在使用部署到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:

对于任何与Servlet 3兼容的容器, WEB-INF/lib目录中的WebJars将自动作为静态资源提供。 这是有效的,因为WEB-INF/lib JAR中的META-INF/resources目录中的任何内容都会自动公开为静态资源。

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

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

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

WebSphere v8.5 JAR META-INF/resources提供文件,您需要WebSphere v8.5
查看此页面以获取更多详细信息 - JavaServer Pages静态文件访问的Web容器配置

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

URL ServletContext.getResource(String path)
Set ServletContext.getResourcePaths(String path) 

应用程序WAR文件中WEB-INF / Lib目录下的片段的META-INF / resources目录

在搜索预片段文档根之后,Web容器搜索Web片段。 Web片段包括应用程序WEB-INF / lib目录中的JAR文件。 JAR可能包含在JAR文件中定义的META-INF / resources目录中的静态资源。 要阻止Web容器搜索META-INF / resources目录,请将com.ibm.ws.webcontainer.SkipMetaInfResourcesProcessing Web容器定制属性设置为true。 custom属性的默认值为false

 com.ibm.ws.webcontainer.SkipMetaInfResourcesProcessing = true 

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM