1

我有一个在Glassfish 3.0.1上运行的Liferay 6.0实例,它带有用JSF 和 RichFaces编写的自定义 portlet 。所有 UI 部分(xhtml 文件、js、css 等)都从 war目录中的 jar 文件加载。所有资源文件都放在jars 的目录下。WEB-INF/libMETA-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 不使用该类加载器。

4

1 回答 1

1

该问题是由 Liferay 6.0 版本引起的,因为更新版本的 Liferay (6.1/6.2) 可以在相同的应用程序和事件与相同的 Glassfish 版本中正常工作。Liferay 6.0 捕获发送到应用服务器的所有请求,但无法正确确定它应该如何处理请求以及WebappClassloader应该调用哪个请求。所以只需使用它自己的WebappClassloader实例。这就是为什么应用程序的所有资源都没有被加载的原因。

于 2015-01-04T00:41:53.340 回答