diff --git a/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/runner/classpath/ModifiedClassPathRunner.java b/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/runner/classpath/ModifiedClassPathRunner.java index 8f63774afe4..51dd37cea09 100644 --- a/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/runner/classpath/ModifiedClassPathRunner.java +++ b/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/runner/classpath/ModifiedClassPathRunner.java @@ -18,6 +18,7 @@ package org.springframework.boot.testsupport.runner.classpath; import java.io.File; import java.lang.annotation.Annotation; +import java.lang.management.ManagementFactory; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; @@ -27,6 +28,7 @@ import java.util.Collections; import java.util.List; import java.util.jar.Attributes; import java.util.jar.JarFile; +import java.util.stream.Stream; import org.apache.maven.repository.internal.MavenRepositorySystemUtils; import org.eclipse.aether.DefaultRepositorySystemSession; @@ -87,33 +89,55 @@ public class ModifiedClassPathRunner extends BlockJUnit4ClassRunner { } private URLClassLoader createTestClassLoader(Class testClass) throws Exception { - URLClassLoader classLoader = (URLClassLoader) this.getClass().getClassLoader(); + ClassLoader classLoader = this.getClass().getClassLoader(); return new ModifiedClassPathClassLoader( processUrls(extractUrls(classLoader), testClass), classLoader.getParent(), classLoader); } - private URL[] extractUrls(URLClassLoader classLoader) throws Exception { + private URL[] extractUrls(ClassLoader classLoader) throws Exception { List extractedUrls = new ArrayList<>(); - for (URL url : classLoader.getURLs()) { + doExtractUrls(classLoader).forEach((URL url) -> { if (isSurefireBooterJar(url)) { extractedUrls.addAll(extractUrlsFromManifestClassPath(url)); } else { extractedUrls.add(url); } - } + }); return extractedUrls.toArray(new URL[extractedUrls.size()]); } + private Stream doExtractUrls(ClassLoader classLoader) throws Exception { + if (classLoader instanceof URLClassLoader) { + return Stream.of(((URLClassLoader) classLoader).getURLs()); + } + return Stream.of(ManagementFactory.getRuntimeMXBean().getClassPath() + .split(File.pathSeparator)).map(this::toURL); + } + + private URL toURL(String entry) { + try { + return new File(entry).toURI().toURL(); + } + catch (Exception ex) { + throw new IllegalArgumentException(ex); + } + } + private boolean isSurefireBooterJar(URL url) { return url.getPath().contains("surefirebooter"); } - private List extractUrlsFromManifestClassPath(URL booterJar) throws Exception { + private List extractUrlsFromManifestClassPath(URL booterJar) { List urls = new ArrayList<>(); - for (String entry : getClassPath(booterJar)) { - urls.add(new URL(entry)); + try { + for (String entry : getClassPath(booterJar)) { + urls.add(new URL(entry)); + } + } + catch (Exception ex) { + throw new RuntimeException(ex); } return urls; }