Проблема загрузки ресурсов JSF (.xhtml загружает, .css/.js/.gif и т. Д. Нет)

У меня есть экземпляр Liferay 6.0, работающий на Glassfish 3.0.1 с пользовательскими портлетами, написанными на JSF с RichFaces. Все части пользовательского интерфейса (файлы xhtml, js, css и т. Д.), Загруженные из файлов jar во время войны WEB-INF/lib каталог. Все файлы ресурсов помещены под META-INF/resource каталог в банках.

Но у меня есть проблемы с загрузкой ресурсов: файлы xhtml загружаются из jar-файлов, но не более того. Когда я пытаюсь загрузить файл js или css напрямую, это выдает ошибку 404. Xhtml файлы могут быть загружены напрямую с их URL. Я попытался поиграть с настройками в web.xml, я добавил сервлет-сопоставления для сервлета Faces для обработки *.js, но он выдал ошибку 500 вместо 404.

Я почти уверен, что это проблема конфигурации загрузки ресурсов, но я не знаю, как ее исправить. Если у вас есть идея, пожалуйста, помогите! Спасибо!

Обновить

Мне удалось немного сузить проблему: DefaultServlet сервера Glassfish получает запрос и обрабатывает его в WebappClassloader, чтобы найти запрошенный ресурс. Например, если я пытаюсь загрузить /images/logo.gif файл (хранится в банке в моем приложении войны) загрузчик классов пытается найти файл с META-INF/resources/images/logo.gif дорожка. Запрошенный файл фактически находится в том каталоге, который ищет загрузчик классов, поэтому я не понимаю, почему загрузчик классов не может найти этот файл.

Обновление 2

Благодаря дополнительной отладке я смог найти корень проблемы: загрузчик классов, вызванный для поиска запрошенного ресурса, является не загрузчиком классов моего приложения, а загрузчиком классов портала Liferay. Если я открою URL, как это: http://127.0.0.1/my-app/images/image1.gif загрузчик классов, обслуживающий запрос, будет не моим приложением, а порталом Liferay. В дампе памяти VisualVM я мог видеть, что в моем приложении также есть экземпляр загрузчика классов со всеми загруженными банками, но я не знаю, почему Glassfish не использует этот загрузчик классов.

1 ответ

Проблема была вызвана версией Liferay 6.0, поскольку более новые версии Liferay (6.1/6.2) правильно работают с тем же приложением и событием с той же версией Glassfish. Liferay 6.0 перехватывает все запросы, отправленные на сервер приложений, но не может правильно определить, как он должен обрабатывать запрос и какие WebappClassloader следует призвать к этому. Так просто использует свой WebappClassloader пример. Вот почему все ресурсы приложения не загружаются.

Другие вопросы по тегам