[英]How to correctly refactor ibm-ejb-jar-bnd.xmi file while doing app migration from WebSphere Application Server traditional to Liberty?
[英]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
,事情就停止了。 这是我到目前为止发现的:
.war
包中,位于WEB-INF/lib
文件夹中。 serveResource
方法声明中使用的ClassLoader
在其类路径中包含所有WebJars。 ClassLoader
的实现是com.ibm.ws.classloader.CompoundClassLoader
。 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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.