diff --git a/src/org/redkale/boot/Application.java b/src/org/redkale/boot/Application.java index a13f902f1..ce45f2e28 100644 --- a/src/org/redkale/boot/Application.java +++ b/src/org/redkale/boot/Application.java @@ -139,6 +139,9 @@ public final class Application { //ę ¹ClassLoader private final RedkaleClassLoader classLoader; + //Serverę ¹ClassLoader + private final RedkaleClassLoader serverClassLoader; + private Application(final AnyValue config) { this(false, config); } @@ -270,6 +273,7 @@ public final class Application { this.transportFactory = new TransportFactory(transportExec, transportPool, transportGroup); this.classLoader = new RedkaleClassLoader(Thread.currentThread().getContextClassLoader()); Thread.currentThread().setContextClassLoader(this.classLoader); + this.serverClassLoader = new RedkaleClassLoader(this.classLoader); } public ResourceFactory getResourceFactory() { @@ -284,6 +288,10 @@ public final class Application { return classLoader; } + public RedkaleClassLoader getServerClassLoader() { + return serverClassLoader; + } + public List getNodeServers() { return new ArrayList<>(servers); } diff --git a/src/org/redkale/boot/ClassFilter.java b/src/org/redkale/boot/ClassFilter.java index b3948923e..6bdfad702 100644 --- a/src/org/redkale/boot/ClassFilter.java +++ b/src/org/redkale/boot/ClassFilter.java @@ -453,7 +453,7 @@ public final class ClassFilter { List urljares = new ArrayList<>(2); final URL exurl = excludeFile != null ? excludeFile.toURI().toURL() : null; final Pattern[] excludePatterns = toPattern(excludeRegs); - for (URL url : loader.getURLs()) { + for (URL url : loader.getAllURLs()) { if (exurl != null && exurl.sameFile(url)) continue; if (excludePatterns != null) { boolean skip = false; diff --git a/src/org/redkale/boot/NodeServer.java b/src/org/redkale/boot/NodeServer.java index 847694a88..088cd0779 100644 --- a/src/org/redkale/boot/NodeServer.java +++ b/src/org/redkale/boot/NodeServer.java @@ -90,7 +90,7 @@ public abstract class NodeServer { this.resourceFactory = application.getResourceFactory().createChild(); this.server = server; this.logger = Logger.getLogger(this.getClass().getSimpleName()); - this.classLoader = new RedkaleClassLoader(Thread.currentThread().getContextClassLoader()); + this.classLoader = new RedkaleClassLoader(application.getServerClassLoader()); Thread.currentThread().setContextClassLoader(this.classLoader); } diff --git a/src/org/redkale/util/RedkaleClassLoader.java b/src/org/redkale/util/RedkaleClassLoader.java index 87ed9750f..d492a399b 100644 --- a/src/org/redkale/util/RedkaleClassLoader.java +++ b/src/org/redkale/util/RedkaleClassLoader.java @@ -15,22 +15,7 @@ import java.util.HashSet; public class RedkaleClassLoader extends URLClassLoader { public RedkaleClassLoader(ClassLoader parent) { - super(parentURL(parent), parent); - } - - private static URL[] parentURL(ClassLoader parent) { - ClassLoader loader = parent; - HashSet set = new HashSet<>(); - do { - String loaderName = loader.getClass().getName(); - if (loaderName.startsWith("sun.") && loaderName.contains("ExtClassLoader")) continue; - if (loader instanceof URLClassLoader) { - for (URL url : ((URLClassLoader) loader).getURLs()) { - set.add(url); - } - } - } while ((loader = loader.getParent()) != null); - return set.toArray(new URL[set.size()]); + super(new URL[0], parent); } public Class loadClass(String name, byte[] b) { @@ -47,4 +32,18 @@ public class RedkaleClassLoader extends URLClassLoader { return super.getURLs(); } + public URL[] getAllURLs() { + ClassLoader loader = this; + HashSet set = new HashSet<>(); + do { + String loaderName = loader.getClass().getName(); + if (loaderName.startsWith("sun.") && loaderName.contains("ExtClassLoader")) continue; + if (loader instanceof URLClassLoader) { + for (URL url : ((URLClassLoader) loader).getURLs()) { + set.add(url); + } + } + } while ((loader = loader.getParent()) != null); + return set.toArray(new URL[set.size()]); + } }