0

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

我在 web.xml 中使用 Servlet 3.0,并将这一行放在我的应用程序配置中:

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

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

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

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

有任何想法吗?

4

2 回答 2

1

/META-INF/resources/from jars的服务/WEB-INF/lib/*.jar是 Servlet 3.0 规范的一个特性。

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

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

但是,您使用的是 Spring MVC,并且您的配置似乎试图绕过 Container 的这个功能。不要让 Spring MVC 处理或服务这些资源,让它从 Spring 中流出,让 Web Container 自己服务这些资源。

此外,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

于 2015-09-25T20:16:42.827 回答
0

我发现了这个问题。

这只是一个安全问题,如果 URL 受到保护,如果没有会话启动,任何资源都将可用。

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

谢谢。

于 2015-09-28T14:21:22.680 回答