Commit e2b3c03f authored by Phillip Webb's avatar Phillip Webb

Refine LaunchedURLClassLoader load order

Refine the loading order of LaunchedURLClassLoader to consider the
root loader before locally bundled classes.

The prevents classes from locally bundled JARs from replacing system
classes.

Issue: #56232870
parent 680741fd
......@@ -31,6 +31,8 @@ import org.springframework.boot.loader.jar.RandomAccessJarFile;
*/
public class LaunchedURLClassLoader extends URLClassLoader {
private final ClassLoader rootClassLoader;
/**
* Create a new {@link LaunchedURLClassLoader} instance.
* @param urls the URLs from which to load classes and resources
......@@ -38,6 +40,17 @@ public class LaunchedURLClassLoader extends URLClassLoader {
*/
public LaunchedURLClassLoader(URL[] urls, ClassLoader parent) {
super(urls, parent);
this.rootClassLoader = findRootClassLoader(parent);
}
private ClassLoader findRootClassLoader(ClassLoader classLoader) {
while (classLoader != null) {
if (classLoader.getParent() == null) {
return classLoader;
}
classLoader = classLoader.getParent();
}
return null;
}
/**
......@@ -59,11 +72,24 @@ public class LaunchedURLClassLoader extends URLClassLoader {
}
private Class<?> doLoadClass(String name) throws ClassNotFoundException {
// 1) Try the root class loader
try {
if (this.rootClassLoader != null) {
return this.rootClassLoader.loadClass(name);
}
}
catch (Exception ex) {
}
// 2) Try to find locally
try {
return findClass(name);
}
catch (ClassNotFoundException e) {
catch (Exception ex) {
}
// 3) Use standard loading
return super.loadClass(name, false);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment