Improve handling of absolute URLs in Class-Path manifest attribute

Closes gh-10268
pull/8753/merge
Andy Wilkinson 7 years ago
parent 616d11c00a
commit c27d678b81

@ -104,7 +104,7 @@ final class ChangeableUrls implements Iterable<URL> {
return Collections.<URL>emptyList(); return Collections.<URL>emptyList();
} }
try { try {
return getUrlsFromManifestClassPathAttribute(jarFile); return getUrlsFromManifestClassPathAttribute(url, jarFile);
} }
catch (IOException ex) { catch (IOException ex) {
throw new IllegalStateException( throw new IllegalStateException(
@ -126,8 +126,8 @@ final class ChangeableUrls implements Iterable<URL> {
return null; return null;
} }
private static List<URL> getUrlsFromManifestClassPathAttribute(JarFile jarFile) private static List<URL> getUrlsFromManifestClassPathAttribute(URL jarUrl,
throws IOException { JarFile jarFile) throws IOException {
Manifest manifest = jarFile.getManifest(); Manifest manifest = jarFile.getManifest();
if (manifest == null) { if (manifest == null) {
return Collections.<URL>emptyList(); return Collections.<URL>emptyList();
@ -138,17 +138,13 @@ final class ChangeableUrls implements Iterable<URL> {
return Collections.emptyList(); return Collections.emptyList();
} }
String[] entries = StringUtils.delimitedListToStringArray(classPath, " "); String[] entries = StringUtils.delimitedListToStringArray(classPath, " ");
List<URL> urls = new ArrayList<URL>(entries.length); List<URL> urls = new ArrayList<>(entries.length);
File parent = new File(jarFile.getName()).getParentFile(); List<URL> nonExistentEntries = new ArrayList<>();
List<File> nonExistentEntries = new ArrayList<File>();
for (String entry : entries) { for (String entry : entries) {
try { try {
File referenced = new File(entry); URL referenced = new URL(jarUrl, entry);
if (!referenced.isAbsolute()) { if (new File(referenced.getFile()).exists()) {
referenced = new File(parent, entry); urls.add(referenced);
}
if (referenced.exists()) {
urls.add(referenced.toURI().toURL());
} }
else { else {
nonExistentEntries.add(referenced); nonExistentEntries.add(referenced);

@ -75,11 +75,12 @@ public class ChangeableUrlsTests {
@Test @Test
public void urlsFromJarClassPathAreConsidered() throws Exception { public void urlsFromJarClassPathAreConsidered() throws Exception {
File relative = this.temporaryFolder.newFolder(); File relative = this.temporaryFolder.newFolder();
File absolute = this.temporaryFolder.newFolder(); File absoluteFile = this.temporaryFolder.newFolder();
URL absoluteUrl = this.temporaryFolder.newFolder().toURI().toURL();
File jarWithClassPath = makeJarFileWithUrlsInManifestClassPath( File jarWithClassPath = makeJarFileWithUrlsInManifestClassPath(
"project-core/target/classes/", "project-web/target/classes/", "project-core/target/classes/", "project-web/target/classes/",
"does-not-exist/target/classes", relative.getName() + "/", "does-not-exist/target/classes", relative.getName() + "/",
absolute.getAbsolutePath() + "/"); absoluteFile.getAbsolutePath() + "/", absoluteUrl);
new File(jarWithClassPath.getParentFile(), "project-core/target/classes") new File(jarWithClassPath.getParentFile(), "project-core/target/classes")
.mkdirs(); .mkdirs();
new File(jarWithClassPath.getParentFile(), "project-web/target/classes").mkdirs(); new File(jarWithClassPath.getParentFile(), "project-web/target/classes").mkdirs();
@ -89,7 +90,7 @@ public class ChangeableUrlsTests {
assertThat(urls.toList()).containsExactly( assertThat(urls.toList()).containsExactly(
new URL(jarWithClassPath.toURI().toURL(), "project-core/target/classes/"), new URL(jarWithClassPath.toURI().toURL(), "project-core/target/classes/"),
new URL(jarWithClassPath.toURI().toURL(), "project-web/target/classes/"), new URL(jarWithClassPath.toURI().toURL(), "project-web/target/classes/"),
relative.toURI().toURL(), absolute.toURI().toURL()); relative.toURI().toURL(), absoluteFile.toURI().toURL(), absoluteUrl);
} }
private URL makeUrl(String name) throws IOException { private URL makeUrl(String name) throws IOException {

Loading…
Cancel
Save