@ -18,6 +18,7 @@ package org.springframework.boot.testsupport.runner.classpath;
@@ -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;
@@ -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 {
@@ -87,33 +89,55 @@ public class ModifiedClassPathRunner extends BlockJUnit4ClassRunner {
}
private URLClassLoader createTestClassLoader ( Class < ? > testClass ) throws Exception {
URL ClassLoader classLoader = ( URLClassLoader ) this . getClass ( ) . getClassLoader ( ) ;
ClassLoader classLoader = this . getClass ( ) . getClassLoader ( ) ;
return new ModifiedClassPathClassLoader (
processUrls ( extractUrls ( classLoader ) , testClass ) , classLoader . getParent ( ) ,
classLoader ) ;
}
private URL [ ] extractUrls ( URL ClassLoader classLoader ) throws Exception {
private URL [ ] extractUrls ( ClassLoader classLoader ) throws Exception {
List < URL > 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 < URL > 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 < URL > extractUrlsFromManifestClassPath ( URL booterJar ) throws Exception {
private List < URL > extractUrlsFromManifestClassPath ( URL booterJar ) {
List < URL > 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 ;
}