无法提供/WEB-INF/lib/*.jar!/META-INF/resources/内容

时间:2015-09-25 20:11:05

标签: spring-mvc jetty web.xml tomcat8 meta-inf

我有一个GWT-Spring项目,我还有两个模块在Web项目中用作库,一切正常,但我试图在其中一个模块上放置一些静态资源(JAR)但是我在部署应用程序时没有看到我的资源,当我尝试获取它时,我只是得到了404。

我在web.xml中使用Servlet 3.0,并将此行放在我的application-config中:

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

此外,我将所有资源都放在JAR内的META-INF /资源文件夹下。

如果我转到:http://localhost:8888/path/resources运行Jetty(IntelliJ)项目我可以看到这些文件夹的完整列表(我放在META-INF /资源JAR上的所有文件夹和Web项目上的资源,但关于JAR,我只能看到文件夹,而不是文件夹。

如果我使用tomcat运行项目,我只能看到Web项目中的资源,但是只能看到JAR中的任何资源。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

/META-INF/resources/中找到的/WEB-INF/lib/*.jar服务是Servlet 3.0规范的一项功能。

因此,Jetty的内部实现(即其DefaultServlet)负责根据对此内容的请求提供此内容。

在Jetty上,这是通过将/META-INF/resources/内容解压缩到WebApp工作目录中以作为磁盘中的普通文件来完成的。

但是,您正在使用Spring MVC,并且您的配置似乎试图绕过Container的这个功能。不要让Spring MVC处理或服务这些资源,让它流出Spring并让Web容器本身为这些资源提供服务。

此外,Jetty的实现可以比任何通用的Servlet更好地服务于这些(实际上是任何类型的)静态资源方式(它使用Jetty的内部功能来实现这一点)。

示例:

假设您有foo.war/WEB-INF/lib/bar.jar包含一个资源/META-INF/resources/js/main.js

假设你的Jetty服务器上有localhost:8080的连接器,默认的webapp部署,导致/foo的上下文路径为foo.war,那么可以使用请求http://localhost:8080/foo/js/main.js

创建了一个示例项目,展示了:

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

答案 1 :(得分:0)

我发现了这个问题。

这只是一个安全问题,如果网址受到保护,如果没有会话开始,任何资源都可用。

此外,WEB-INF/lib/*.jar!/META-INF/resources 内的资源不会在另一个“资源”文件夹下发布,而是直接在根目录上发布。

感谢。