Java 使用JRebel 6.0.0部署时,在Spring 4.1.2更新后找不到资源
Spring 4.1.2(4.0.8和3.2.12)包含一个安全错误修复程序,可防止Java 使用JRebel 6.0.0部署时,在Spring 4.1.2更新后找不到资源,java,spring,spring-mvc,jrebel,Java,Spring,Spring Mvc,Jrebel,Spring 4.1.2(4.0.8和3.2.12)包含一个安全错误修复程序,可防止ResourceHttpRequestHandler()从资源文件夹外部加载文件 另一方面:is(我使用它的默认配置)。而且,JRebel做了一些神奇的事情,不是从wtp文件夹加载资源,而是直接从“源”文件夹加载资源 因此,在从Spring 3.2.11升级到3.2.12(以及从4.0.7升级到4.0.8的其他类似应用程序)之后,SpringResourceHttpRequestHandler不再提供由JRebe
ResourceHttpRequestHandler
(
)从资源文件夹外部加载文件
另一方面:is(我使用它的默认配置)。而且,JRebel做了一些神奇的事情,不是从wtp文件夹加载资源,而是直接从“源”文件夹加载资源
因此,在从Spring 3.2.11升级到3.2.12(以及从4.0.7升级到4.0.8的其他类似应用程序)之后,SpringResourceHttpRequestHandler
不再提供由JRebel“维护”的资源文件。而是提供了一个404。原因是Spring将配置的资源文件夹的绝对文件路径与要传递的文件的绝对文件路径进行比较。如果ResourceHttpRequestHandler
察觉到该文件位于已配置的资源文件夹之外,则它假定用于选择该文件的url是恶意的。因此,找不到ResourceHttpRequestHandler
和404资源的响应
我希望JRebel可以配置为不“维护”js、png和css文件,但我不知道如何配置。这就是问题:如何配置JRebel,使SpringMVC应用程序(V4.0.8)仍然使用ResourceHttpRequestHandler交付资源?
?
(我预计几乎每个JRebel用户在升级到Spring 4.1.2、4.0.8或3.2.12后都会面临这个问题)
(请不要误解我的意思,这不是一个如何操纵Spring以不检查文件是否在configures resource文件夹之外的问题。我已经查看了源代码,观察到的行为是Bug fix的作者想要的行为。-这个问题是关于配置JRebel的)感谢您对问题的精彩描述 看起来这个Spring更改将不兼容性引入了JRebel。我是JRebel团队的成员,将确保这一问题得到解决 作为一种解决方法,您可以在rebel.xml
元素中使用
标记来告诉JRebel不要接触这些特定文件。下面是有关如何配置它的更多信息
其他更简单的解决方法是完全删除
元素。基于smartman的anwser,我将rebel.xml配置如下:
<classpath>
<dir name="${rebel.workspace.path}/myproject/target/classes">
</dir>
<dir name="${rebel.workspace.path}/myproject/target/test-classes">
</dir>
</classpath>
<web>
<link target="/">
<dir name="${rebel.workspace.path}/myproject/src/main/webapp">
<exclude name="resources/**"/>
</dir>
</link>
</web>
这将排除所有资源,但至少会更新视图(jsp和标记文件)。但当我进行大量前端开发时,我需要同时更改控制器、视图和样式,这种配置是无用的,我必须同时关闭jrebel 这个问题在JRebel中已经修复(我无法用当前的JRebel 6.1.1复制它)-我猜它是从6.0.2开始修复的(2014年12月23日) 修复了Spring ResourceHttpRequestHandler无法为webroot之外的资源提供服务的问题 (JRebel变更日志)
对于那些感兴趣的人,他们是如何解决的: 我只能猜测,因为它很奇怪。 Spring4.1.6(即我用于测试的版本)有类
org.springframework.web.servlet.resource.PathResourceResolver
有方法检查资源(资源,资源位置)
:
第一个if
:isResourceUnderLocation…
是检查请求是否正在访问已配置资源文件夹之外的资源的方法
isResourceUnderLocation(Resource resource, Resource location) {
...
resourcePath = ((ServletContextResource) resource).getPath();
locationPath = StringUtils.cleanPath(((ServletContextResource) location).getPath());
...
if (!resourcePath.startsWith(locationPath)) {
return false;
}
...
}
当我使用调试器检查正在发生的事情时,JRebel处于活动状态,然后发生了一些奇怪的事情:当JVM到达行if(isResourceUnderLocation(resource,location)){
,那么方法isResourceUnderLocation
就不会被调用
因此,我得出结论,JRebel进行了一些字节码操作,以防止检查(整个
都是源位置方法)执行。谢谢你的否决票。但是请留下评论,让我知道你不喜欢什么,这样我下次可以写更好的问题。我也遇到同样的问题,但我没有使用JRebel。我只是从Spring 4.1.0更新到4.1.2,现在资源不起作用,返回总是找不到的错误!你能帮我吗?@Beto Neto:p请写一个关于你的问题的新问题。你可以链接到这个问题来解释Spring更新,但可以问你自己的问题,因为答案会/必须不同。假设/myproject/src/main/webapp/resources
只包含
提供的资源,如图像、css、js等,而不包含我使用了josefine的答案(基于您的答案)提供的示例,但是JRebel并没有“部署”类似css文件的资源(因为它们被排除在外)-另一方面,JRebel要求禁用Eclipse/Tomcat自动部署功能。因此,每次更改CSS文件时,我都必须手动重新启动服务器!这使得JRebel无法使用!-我忽略了什么吗?-你有一个简短的答案,还是我应该创建一个新的Stackoverflow问题?已经有一段时间了,这个问题有解决方案吗有问题吗?正如之前评论中所述,您的解决方案不幸不适用于我的需要。
isResourceUnderLocation(Resource resource, Resource location) {
...
resourcePath = ((ServletContextResource) resource).getPath();
locationPath = StringUtils.cleanPath(((ServletContextResource) location).getPath());
...
if (!resourcePath.startsWith(locationPath)) {
return false;
}
...
}