Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
302a0692
S
spring-framework
项目概览
爱吃血肠
/
spring-framework
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
spring-framework
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
302a0692
编写于
10月 13, 2015
作者:
J
Juergen Hoeller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
AbstractFileResolvingResource uses extractArchiveURL for last-modified check
Issue: SPR-13393
上级
c33c26ac
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
75 addition
and
10 deletion
+75
-10
spring-core/src/main/java/org/springframework/core/io/AbstractFileResolvingResource.java
...pringframework/core/io/AbstractFileResolvingResource.java
+2
-2
spring-core/src/main/java/org/springframework/util/ResourceUtils.java
...src/main/java/org/springframework/util/ResourceUtils.java
+36
-2
spring-core/src/test/java/org/springframework/util/ResourceUtilsTests.java
...est/java/org/springframework/util/ResourceUtilsTests.java
+37
-6
未找到文件。
spring-core/src/main/java/org/springframework/core/io/AbstractFileResolvingResource.java
浏览文件 @
302a0692
/*
/*
* Copyright 2002-201
3
the original author or authors.
* Copyright 2002-201
5
the original author or authors.
*
*
* Licensed under the Apache License, Version 2.0 (the "License");
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* you may not use this file except in compliance with the License.
...
@@ -60,7 +60,7 @@ public abstract class AbstractFileResolvingResource extends AbstractResource {
...
@@ -60,7 +60,7 @@ public abstract class AbstractFileResolvingResource extends AbstractResource {
protected
File
getFileForLastModifiedCheck
()
throws
IOException
{
protected
File
getFileForLastModifiedCheck
()
throws
IOException
{
URL
url
=
getURL
();
URL
url
=
getURL
();
if
(
ResourceUtils
.
isJarURL
(
url
))
{
if
(
ResourceUtils
.
isJarURL
(
url
))
{
URL
actualUrl
=
ResourceUtils
.
extract
JarFil
eURL
(
url
);
URL
actualUrl
=
ResourceUtils
.
extract
Archiv
eURL
(
url
);
if
(
actualUrl
.
getProtocol
().
startsWith
(
ResourceUtils
.
URL_PROTOCOL_VFS
))
{
if
(
actualUrl
.
getProtocol
().
startsWith
(
ResourceUtils
.
URL_PROTOCOL_VFS
))
{
return
VfsResourceDelegate
.
getResource
(
actualUrl
).
getFile
();
return
VfsResourceDelegate
.
getResource
(
actualUrl
).
getFile
();
}
}
...
...
spring-core/src/main/java/org/springframework/util/ResourceUtils.java
浏览文件 @
302a0692
/*
/*
* Copyright 2002-201
4
the original author or authors.
* Copyright 2002-201
5
the original author or authors.
*
*
* Licensed under the Apache License, Version 2.0 (the "License");
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* you may not use this file except in compliance with the License.
...
@@ -57,9 +57,12 @@ public abstract class ResourceUtils {
...
@@ -57,9 +57,12 @@ public abstract class ResourceUtils {
/** URL prefix for loading from the file system: "file:" */
/** URL prefix for loading from the file system: "file:" */
public
static
final
String
FILE_URL_PREFIX
=
"file:"
;
public
static
final
String
FILE_URL_PREFIX
=
"file:"
;
/** URL prefix for loading from
the file system
: "jar:" */
/** URL prefix for loading from
a jar file
: "jar:" */
public
static
final
String
JAR_URL_PREFIX
=
"jar:"
;
public
static
final
String
JAR_URL_PREFIX
=
"jar:"
;
/** URL prefix for loading from a war file on Tomcat: "war:" */
public
static
final
String
WAR_URL_PREFIX
=
"war:"
;
/** URL protocol for a file in the file system: "file" */
/** URL protocol for a file in the file system: "file" */
public
static
final
String
URL_PROTOCOL_FILE
=
"file"
;
public
static
final
String
URL_PROTOCOL_FILE
=
"file"
;
...
@@ -87,6 +90,9 @@ public abstract class ResourceUtils {
...
@@ -87,6 +90,9 @@ public abstract class ResourceUtils {
/** Separator between JAR URL and file path within the JAR: "!/" */
/** Separator between JAR URL and file path within the JAR: "!/" */
public
static
final
String
JAR_URL_SEPARATOR
=
"!/"
;
public
static
final
String
JAR_URL_SEPARATOR
=
"!/"
;
/** Special separator between WAR URL and jar part on Tomcat */
public
static
final
String
WAR_URL_SEPARATOR
=
"*/"
;
/**
/**
* Return whether the given resource location is a URL:
* Return whether the given resource location is a URL:
...
@@ -319,6 +325,34 @@ public abstract class ResourceUtils {
...
@@ -319,6 +325,34 @@ public abstract class ResourceUtils {
}
}
}
}
/**
* Extract the URL for the outermost archive from the given jar/war URL
* (which may point to a resource in a jar file or to a jar file itself).
* <p>In the case of a jar file nested within a war file, this will return
* a URL to the war file since that is the one resolvable in the file system.
* @param jarUrl the original URL
* @return the URL for the actual jar file
* @throws MalformedURLException if no valid jar file URL could be extracted
* @since 4.1.8
* @see #extractJarFileURL(URL)
*/
public
static
URL
extractArchiveURL
(
URL
jarUrl
)
throws
MalformedURLException
{
String
urlFile
=
jarUrl
.
getFile
();
int
endIndex
=
urlFile
.
indexOf
(
WAR_URL_SEPARATOR
);
if
(
endIndex
!=
-
1
)
{
// Tomcat's "jar:war:file:...mywar.war*/WEB-INF/lib/myjar.jar!/myentry.txt"
String
warFile
=
urlFile
.
substring
(
0
,
endIndex
);
int
startIndex
=
warFile
.
indexOf
(
WAR_URL_PREFIX
);
if
(
startIndex
!=
-
1
)
{
return
new
URL
(
warFile
.
substring
(
startIndex
+
WAR_URL_PREFIX
.
length
()));
}
}
// Regular "jar:file:...myjar.jar!/myentry.txt"
return
extractJarFileURL
(
jarUrl
);
}
/**
/**
* Create a URI instance for the given URL,
* Create a URI instance for the given URL,
* replacing spaces with "%20" URI encoding first.
* replacing spaces with "%20" URI encoding first.
...
...
spring-core/src/test/java/org/springframework/util/ResourceUtilsTests.java
浏览文件 @
302a0692
/*
/*
* Copyright 2002-201
2
the original author or authors.
* Copyright 2002-201
5
the original author or authors.
*
*
* Licensed under the Apache License, Version 2.0 (the "License");
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* you may not use this file except in compliance with the License.
...
@@ -21,22 +21,27 @@ import java.net.URL;
...
@@ -21,22 +21,27 @@ import java.net.URL;
import
java.net.URLConnection
;
import
java.net.URLConnection
;
import
java.net.URLStreamHandler
;
import
java.net.URLStreamHandler
;
import
junit.framework.TestCase
;
import
org.junit.Test
;
import
static
org
.
junit
.
Assert
.*;
/**
/**
* @author Juergen Hoeller
* @author Juergen Hoeller
*/
*/
public
class
ResourceUtilsTests
extends
TestCase
{
public
class
ResourceUtilsTests
{
public
void
testIsJarURL
()
throws
Exception
{
@Test
public
void
isJarURL
()
throws
Exception
{
assertTrue
(
ResourceUtils
.
isJarURL
(
new
URL
(
"jar:file:myjar.jar!/mypath"
)));
assertTrue
(
ResourceUtils
.
isJarURL
(
new
URL
(
"jar:file:myjar.jar!/mypath"
)));
assertTrue
(
ResourceUtils
.
isJarURL
(
new
URL
(
null
,
"zip:file:myjar.jar!/mypath"
,
new
DummyURLStreamHandler
())));
assertTrue
(
ResourceUtils
.
isJarURL
(
new
URL
(
null
,
"zip:file:myjar.jar!/mypath"
,
new
DummyURLStreamHandler
())));
assertTrue
(
ResourceUtils
.
isJarURL
(
new
URL
(
null
,
"wsjar:file:myjar.jar!/mypath"
,
new
DummyURLStreamHandler
())));
assertTrue
(
ResourceUtils
.
isJarURL
(
new
URL
(
null
,
"wsjar:file:myjar.jar!/mypath"
,
new
DummyURLStreamHandler
())));
assertTrue
(
ResourceUtils
.
isJarURL
(
new
URL
(
null
,
"jar:war:file:mywar.war*/myjar.jar!/mypath"
,
new
DummyURLStreamHandler
())));
assertFalse
(
ResourceUtils
.
isJarURL
(
new
URL
(
"file:myjar.jar"
)));
assertFalse
(
ResourceUtils
.
isJarURL
(
new
URL
(
"file:myjar.jar"
)));
assertFalse
(
ResourceUtils
.
isJarURL
(
new
URL
(
"http:myserver/myjar.jar"
)));
assertFalse
(
ResourceUtils
.
isJarURL
(
new
URL
(
"http:myserver/myjar.jar"
)));
}
}
public
void
testExtractJarFileURL
()
throws
Exception
{
@Test
public
void
extractJarFileURL
()
throws
Exception
{
assertEquals
(
new
URL
(
"file:myjar.jar"
),
assertEquals
(
new
URL
(
"file:myjar.jar"
),
ResourceUtils
.
extractJarFileURL
(
new
URL
(
"jar:file:myjar.jar!/mypath"
)));
ResourceUtils
.
extractJarFileURL
(
new
URL
(
"jar:file:myjar.jar!/mypath"
)));
assertEquals
(
new
URL
(
"file:/myjar.jar"
),
assertEquals
(
new
URL
(
"file:/myjar.jar"
),
...
@@ -45,14 +50,40 @@ public class ResourceUtilsTests extends TestCase {
...
@@ -45,14 +50,40 @@ public class ResourceUtilsTests extends TestCase {
ResourceUtils
.
extractJarFileURL
(
new
URL
(
null
,
"zip:file:myjar.jar!/mypath"
,
new
DummyURLStreamHandler
())));
ResourceUtils
.
extractJarFileURL
(
new
URL
(
null
,
"zip:file:myjar.jar!/mypath"
,
new
DummyURLStreamHandler
())));
assertEquals
(
new
URL
(
"file:myjar.jar"
),
assertEquals
(
new
URL
(
"file:myjar.jar"
),
ResourceUtils
.
extractJarFileURL
(
new
URL
(
null
,
"wsjar:file:myjar.jar!/mypath"
,
new
DummyURLStreamHandler
())));
ResourceUtils
.
extractJarFileURL
(
new
URL
(
null
,
"wsjar:file:myjar.jar!/mypath"
,
new
DummyURLStreamHandler
())));
assertEquals
(
new
URL
(
"file:myjar.jar"
),
ResourceUtils
.
extractJarFileURL
(
new
URL
(
"file:myjar.jar"
)));
assertEquals
(
new
URL
(
"file:myjar.jar"
),
assertEquals
(
new
URL
(
"file:myjar.jar"
),
ResourceUtils
.
extractJarFileURL
(
new
URL
(
"jar:file:myjar.jar!/"
)));
ResourceUtils
.
extractJarFileURL
(
new
URL
(
"jar:file:myjar.jar!/"
)));
assertEquals
(
new
URL
(
"file:myjar.jar"
),
assertEquals
(
new
URL
(
"file:myjar.jar"
),
ResourceUtils
.
extractJarFileURL
(
new
URL
(
null
,
"zip:file:myjar.jar!/"
,
new
DummyURLStreamHandler
())));
ResourceUtils
.
extractJarFileURL
(
new
URL
(
null
,
"zip:file:myjar.jar!/"
,
new
DummyURLStreamHandler
())));
assertEquals
(
new
URL
(
"file:myjar.jar"
),
assertEquals
(
new
URL
(
"file:myjar.jar"
),
ResourceUtils
.
extractJarFileURL
(
new
URL
(
null
,
"wsjar:file:myjar.jar!/"
,
new
DummyURLStreamHandler
())));
ResourceUtils
.
extractJarFileURL
(
new
URL
(
null
,
"wsjar:file:myjar.jar!/"
,
new
DummyURLStreamHandler
())));
}
@Test
public
void
extractArchiveURL
()
throws
Exception
{
assertEquals
(
new
URL
(
"file:myjar.jar"
),
assertEquals
(
new
URL
(
"file:myjar.jar"
),
ResourceUtils
.
extractJarFileURL
(
new
URL
(
"file:myjar.jar"
)));
ResourceUtils
.
extractArchiveURL
(
new
URL
(
"jar:file:myjar.jar!/mypath"
)));
assertEquals
(
new
URL
(
"file:/myjar.jar"
),
ResourceUtils
.
extractArchiveURL
(
new
URL
(
null
,
"jar:myjar.jar!/mypath"
,
new
DummyURLStreamHandler
())));
assertEquals
(
new
URL
(
"file:myjar.jar"
),
ResourceUtils
.
extractArchiveURL
(
new
URL
(
null
,
"zip:file:myjar.jar!/mypath"
,
new
DummyURLStreamHandler
())));
assertEquals
(
new
URL
(
"file:myjar.jar"
),
ResourceUtils
.
extractArchiveURL
(
new
URL
(
null
,
"wsjar:file:myjar.jar!/mypath"
,
new
DummyURLStreamHandler
())));
assertEquals
(
new
URL
(
"file:mywar.war"
),
ResourceUtils
.
extractArchiveURL
(
new
URL
(
null
,
"jar:war:file:mywar.war*/myjar.jar!/mypath"
,
new
DummyURLStreamHandler
())));
assertEquals
(
new
URL
(
"file:myjar.jar"
),
ResourceUtils
.
extractArchiveURL
(
new
URL
(
"file:myjar.jar"
)));
assertEquals
(
new
URL
(
"file:myjar.jar"
),
ResourceUtils
.
extractArchiveURL
(
new
URL
(
"jar:file:myjar.jar!/"
)));
assertEquals
(
new
URL
(
"file:myjar.jar"
),
ResourceUtils
.
extractArchiveURL
(
new
URL
(
null
,
"zip:file:myjar.jar!/"
,
new
DummyURLStreamHandler
())));
assertEquals
(
new
URL
(
"file:myjar.jar"
),
ResourceUtils
.
extractArchiveURL
(
new
URL
(
null
,
"wsjar:file:myjar.jar!/"
,
new
DummyURLStreamHandler
())));
assertEquals
(
new
URL
(
"file:mywar.war"
),
ResourceUtils
.
extractArchiveURL
(
new
URL
(
null
,
"jar:war:file:mywar.war*/myjar.jar!/"
,
new
DummyURLStreamHandler
())));
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录