我有一个在Glassfish 3.0.1上运行的Liferay 6.0实例,它带有用JSF 和 RichFaces编写的自定义 portlet 。所有 UI 部分(xhtml 文件、js、css 等)都从 war目录中的 jar 文件加载。所有资源文件都放在jars 的目录下。WEB-INF/lib
META-INF/resource
但是我在资源加载方面遇到了问题:从 jar 加载的 xhtml 文件,但没有别的。当我尝试直接加载 js 或 css 文件时,它给了我一个 404 错误。Xhtml 文件可以通过它们的 url 直接加载。我尝试使用 web.xml 中的设置,我为 Faces Servlet 添加了 servlet-mappings 来处理 *.js,但它给出了错误 500 而不是 404。
我很确定这是一个资源加载配置问题,但我不知道如何解决它。如果您有想法,请帮助!谢谢!
更新
我设法将问题缩小了一点:Glassfish 服务器的DefaultServlet接收请求并将其处理到WebappClassloader以查找请求的资源。例如,如果我尝试加载/images/logo.gif
文件(存储在我的 war 应用程序中的 jar 中),类加载器会尝试使用META-INF/resources/images/logo.gif
路径查找文件。请求的文件实际上在类加载器正在寻找的那个目录中,所以我不明白为什么类加载器找不到这个文件。
更新 2
通过更多的调试,我能够找到问题的根源:为查找请求的资源而调用的类加载器不是我的应用程序的类加载器,而是 Liferay 门户的类加载器。如果我打开这样的 URL:http://127.0.0.1/my-app/images/image1.gif
请求后面的类加载器将不是我的应用程序而是 Liferay 门户的类加载器。在 VisualVM 内存转储中,我可以看到我的应用程序也有一个加载了所有 jar 的类加载器实例,但我不知道为什么 Glassfish 不使用该类加载器。