Невозможно предоставить /WEB-INF/lib/*.jar!/META-INF/resources/ контент

У меня есть проект GWT-Spring, и у меня также есть два модуля, которые используются в качестве библиотек в веб-проекте, все работает нормально, но я пытаюсь поместить некоторые статические ресурсы в один из этих модулей (JAR), но я не видя своих ресурсов при развертывании приложения, я просто получаю 404, когда пытаюсь их получить.

Я использую Servlet 3.0 в web.xml и помещаю эту строку в мой application-config:

<mvc:resources mapping="/resources/**"  location="classpath:/META-INF/resources" ></mvc:resources>

Также я помещаю все свои ресурсы в папку META-INF/resources внутри JAR.

Запустив проект с Jetty (IntelliJ), если я захожу по адресу: http://localhost:8888/path/resources, я вижу полный список этих папок (все папки, которые я поместил в JAR-файл META-INF/resources, и ресурсы на веб-проект, но про JAR я вижу только папки, а не файлы на них!.)

И если я запускаю проект с tomcat, я вижу только ресурсы в веб-проекте, но что-нибудь из JAR.

Есть идеи?

2 ответа

Решение

Я нашел проблему.

Это была просто проблема безопасности, если URL-адреса защищены, любой ресурс будет доступен, если сеанс не запущен.

Кроме того, ресурсы внутри WEB-INF/lib/*.jar!/META-INF/resources не публикуются в другой папке "ресурсы", но публикуются непосредственно в корне.

Благодарю.

Порция /META-INF/resources/ из банок, найденных в /WEB-INF/lib/*.jar это особенность Servlet 3.0 spec.

Таким образом, внутренняя реализация Jetty (а именно его DefaultServlet) несет ответственность за предоставление этого контента обратно на запросы для этого контента.

На Jetty это достигается путем распаковки /META-INF/resources/ содержимое в рабочем каталоге WebApp, которое будет обслуживаться как обычные файлы с диска.

Однако вы используете Spring MVC, и ваша конфигурация пытается обойти это средство Контейнера. Не позволяйте Spring MVC обрабатывать или обслуживать эти ресурсы, пусть он вытекает из Spring и позволяет самому веб-контейнеру обслуживать эти ресурсы.

Кроме того, реализация Jetty может обслуживать эти (и в действительности любые виды) статических ресурсов намного лучше, чем любой универсальный сервлет (для этого используются внутренние функции Jetty).

Пример:

Допустим, вы имели foo.warс /WEB-INF/lib/bar.jar который содержал один ресурс /META-INF/resources/js/main.js,

Предполагая, что у вас был Jetty Server с подключенным разъемом localhost:8080с развертыванием веб-приложения по умолчанию, что приводит к контекстному пути /foo для тебя foo.warк этому ресурсу можно обратиться с запросом к http://localhost:8080/foo/js/main.js

Создан пример проекта, демонстрирующий это на:

https://github.com/jetty-project/jetty-example-metainf-resources

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