3

我正在使用部署到 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 兼容的容器,目录中的 WebJars 都会 WEB-INF/lib自动作为静态资源使用。这是因为META-INF/resources JAR 中目录中的任何内容WEB-INF/lib都会自动公开为静态资源。

当我将相应的 WebJars 放入我pom.xml的 . 这是我到目前为止发现的:

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

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

4

1 回答 1

1

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

使用以下方法来定位您的静态文件:

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

应用WAR文件中WEB-INF/Lib目录下fragment的META-INF/resources目录

在搜索到 pre-fragment 文档根之后,Web 容器会搜索 Web Fragment。Web 片段包含应用程序 WEB-INF/lib 目录中的 JAR 文件。JAR 可能包括在 JAR 文件中定义的 META-INF/resources 目录中的静态资源。要防止 Web 容器搜索 META-INF/resources 目录,请将 com.ibm.ws.webcontainer.SkipMetaInfResourcesProcessingWeb 容器定制属性设置为 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

于 2014-10-06T10:49:03.353 回答