diff --git a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/LaunchedURLClassLoader.java b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/LaunchedURLClassLoader.java index c8ffb30da0d4..77c97e4817b8 100644 --- a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/LaunchedURLClassLoader.java +++ b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/LaunchedURLClassLoader.java @@ -21,6 +21,8 @@ import java.net.URLClassLoader; import java.security.AccessController; import java.security.PrivilegedExceptionAction; +import java.util.Arrays; +import java.util.Collections; import java.util.Enumeration; import org.springframework.boot.loader.jar.JarFile; @@ -63,6 +65,28 @@ public URL getResource(String name) { return (url == null ? findResource(name) : url); } + @Override + public URL findResource(String name) { + if (name.equals("")) { + URL[] urls = getURLs(); + if (urls.length > 0) { + return urls[0]; + } + } + return super.findResource(name); + } + + @Override + public Enumeration findResources(String name) throws IOException { + if (name.equals("")) { + URL[] urls = getURLs(); + if (urls.length > 0) { + return Collections.enumeration(Arrays.asList(urls)); + } + } + return super.findResources(name); + } + @Override public Enumeration getResources(String name) throws IOException { diff --git a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/Launcher.java b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/Launcher.java index 1fed45d1b076..bf6c2305edfc 100644 --- a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/Launcher.java +++ b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/Launcher.java @@ -75,6 +75,8 @@ protected void launch(String[] args) { protected ClassLoader createClassLoader(List archives) throws Exception { List urls = new ArrayList(archives.size()); for (Archive archive : archives) { + // Add the current archive at end (it will be reversed and end up taking + // precedence) urls.add(archive.getUrl()); } return createClassLoader(urls.toArray(new URL[urls.size()])); diff --git a/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/LaunchedURLClassLoaderTests.java b/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/LaunchedURLClassLoaderTests.java new file mode 100644 index 000000000000..6a8320d3d946 --- /dev/null +++ b/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/LaunchedURLClassLoaderTests.java @@ -0,0 +1,63 @@ +/* + * Copyright 2012-2013 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.loader; + +import java.net.URL; + +import org.junit.Test; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +/** + * @author Dave Syer + */ +public class LaunchedURLClassLoaderTests { + + @Test + public void resolveResourceFromArchive() throws Exception { + LaunchedURLClassLoader loader = new LaunchedURLClassLoader(new URL[] { new URL( + "jar:file:src/test/resources/jars/app.jar!/") }, getClass() + .getClassLoader()); + assertNotNull(loader.getResource("demo/Application.java")); + } + + @Test + public void resolveResourcesFromArchive() throws Exception { + LaunchedURLClassLoader loader = new LaunchedURLClassLoader(new URL[] { new URL( + "jar:file:src/test/resources/jars/app.jar!/") }, getClass() + .getClassLoader()); + assertTrue(loader.getResources("demo/Application.java").hasMoreElements()); + } + + @Test + public void resolveRootPathFromArchive() throws Exception { + LaunchedURLClassLoader loader = new LaunchedURLClassLoader(new URL[] { new URL( + "jar:file:src/test/resources/jars/app.jar!/") }, getClass() + .getClassLoader()); + assertNotNull(loader.getResource("")); + } + + @Test + public void resolveRootResourcesFromArchive() throws Exception { + LaunchedURLClassLoader loader = new LaunchedURLClassLoader(new URL[] { new URL( + "jar:file:src/test/resources/jars/app.jar!/") }, getClass() + .getClassLoader()); + assertTrue(loader.getResources("").hasMoreElements()); + } + +} diff --git a/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/archive/ExplodedArchiveTests.java b/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/archive/ExplodedArchiveTests.java index 79a398b83668..96ef50472b61 100644 --- a/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/archive/ExplodedArchiveTests.java +++ b/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/archive/ExplodedArchiveTests.java @@ -126,7 +126,6 @@ public void nestedDirArchive() throws Exception { } @Test - @SuppressWarnings("resource") public void getFilteredArchive() throws Exception { Archive filteredArchive = this.archive .getFilteredArchive(new Archive.EntryRenameFilter() {