我有一个Liferay 6.0实例运行在Glassfish 3.0.1上,其中使用JSF编写的自定义portlet与RichFaces。所有UI部分(xhtml文件,js, css等)都是从war的WEB-INF/lib
目录下的jar文件中加载的。所有的资源文件都放在jar文件的META-INF/resource
目录下。
但是我有资源加载的问题:从jar加载xhtml文件,但没有别的。当我尝试直接加载js或css文件时,它会给我一个404错误。可以直接用url加载Xhtml文件。我试着在web.xml中设置,我为Faces Servlet添加了Servlet映射来处理*.js,但它给出了错误500而不是404。
我很确定这是一个资源加载配置问题,但我不知道如何修复它。如果你有想法,请帮忙!谢谢你!
更新
我设法缩小了一点问题:Glassfish服务器的DefaultServlet接收请求并将其处理到WebappClassloader以找到所请求的资源。例如,如果我尝试加载/images/logo.gif
文件(存储在我的战争应用程序中的jar中),类加载器试图找到META-INF/resources/images/logo.gif
路径的文件。被请求的文件实际上在类加载器正在寻找的目录中,所以我不明白为什么类加载器找不到这个文件。
更新2
通过更多的调试,我能够找到问题的根源:调用来查找所请求资源的类加载器不是我的应用程序的类加载器,而是Liferay门户的类加载器。如果我像这样打开一个URL: http://127.0.0.1/my-app/images/image1.gif
,请求背后的类加载器将不是我的应用程序,而是Liferay门户。在VisualVM内存转储中,我可以看到我的应用程序也有一个类加载器实例,其中加载了所有的jar,但我不知道为什么Glassfish不使用该类加载器。
这个问题是由Liferay 6.0版本引起的,因为Liferay的新版本(6.1/6.2)在使用相同的Glassfish版本的相同应用程序和事件下正常工作。Liferay 6.0捕获发送到应用服务器的所有请求,但不能正确地确定它应该如何处理请求以及应该为它调用哪个WebappClassloader
。所以简单地使用它自己的WebappClassloader
实例。这就是为什么应用程序的所有资源都没有被加载。