我正在使用部署到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
时,事情就停止了。这是我到目前为止所发现的:
.war
文件夹中生成的WEB-INF/lib
包中。ClassLoader
方法声明中使用的serveResource
在其类路径中包含所有WebJars。ClassLoader
的实施是com.ibm.ws.classloader.CompoundClassLoader
。META-INF/resources
文件夹中WebJars中的所有资源都不可见ClassLoader
。无。如何让类加载器查看WebJars中的资源?
答案 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();
}