Невозможно предоставить /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