我有一个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中的任何资源。
有什么想法吗?
答案 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
创建了一个示例项目,展示了:
答案 1 :(得分:0)
我发现了这个问题。
这只是一个安全问题,如果网址受到保护,如果没有会话开始,任何资源都可用。
此外,WEB-INF/lib/*.jar!/META-INF/resources
内的资源不会在另一个“资源”文件夹下发布,而是直接在根目录上发布。
感谢。