JSF 资源加载问题(.xhtml加载,.css/.js/.gif 等没有)



我有一个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实例。这就是为什么应用程序的所有资源都没有被加载。

最新更新