From 80391fa8767d75dd71dc232a2f41728e5db26a2a Mon Sep 17 00:00:00 2001 From: Marius Bogoevici Date: Wed, 2 Sep 2015 15:19:22 -0400 Subject: [PATCH] Set extension classloader as parent for the module classloader --- .../boot/loader/ModuleJarLauncher.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/spring-cloud-stream-module-launcher/src/main/java/org/springframework/boot/loader/ModuleJarLauncher.java b/spring-cloud-stream-module-launcher/src/main/java/org/springframework/boot/loader/ModuleJarLauncher.java index 8137c0a24..c580d750e 100644 --- a/spring-cloud-stream-module-launcher/src/main/java/org/springframework/boot/loader/ModuleJarLauncher.java +++ b/spring-cloud-stream-module-launcher/src/main/java/org/springframework/boot/loader/ModuleJarLauncher.java @@ -82,11 +82,15 @@ public class ModuleJarLauncher extends ExecutableArchiveLauncher { protected ClassLoader createClassLoader(URL[] urls) throws Exception { ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); if (systemClassLoader instanceof URLClassLoader) { - URLClassLoader classLoader = (URLClassLoader) systemClassLoader; - URL[] toUse = new URL[urls.length + classLoader.getURLs().length]; - System.arraycopy(urls, 0, toUse, 0, urls.length); - System.arraycopy(classLoader.getURLs(), 0, toUse, urls.length, classLoader.getURLs().length); - return new LaunchedURLClassLoader(toUse, null); + // add the URLs of the application classloader to the created classloader + // to compensate for LaunchedURLClassLoader not delegating to parent to retrieve resources + URLClassLoader systemUrlClassLoader = (URLClassLoader) systemClassLoader; + URL[] mergedUrls = new URL[urls.length + systemUrlClassLoader.getURLs().length]; + System.arraycopy(urls, 0, mergedUrls, 0, urls.length); + System.arraycopy(systemUrlClassLoader.getURLs(), 0, mergedUrls, urls.length, + systemUrlClassLoader.getURLs().length); + // add the extension classloader as parent to the created context, if accessible + return new LaunchedURLClassLoader(mergedUrls, systemUrlClassLoader.getParent()); } else { return new LaunchedURLClassLoader(urls, systemClassLoader); }