This commit is contained in:
Redkale
2017-06-06 09:43:31 +08:00
parent 43f9f50f4c
commit 6421bc2851
4 changed files with 25 additions and 18 deletions

View File

@@ -139,6 +139,9 @@ public final class Application {
//根ClassLoader //根ClassLoader
private final RedkaleClassLoader classLoader; private final RedkaleClassLoader classLoader;
//Server根ClassLoader
private final RedkaleClassLoader serverClassLoader;
private Application(final AnyValue config) { private Application(final AnyValue config) {
this(false, config); this(false, config);
} }
@@ -270,6 +273,7 @@ public final class Application {
this.transportFactory = new TransportFactory(transportExec, transportPool, transportGroup); this.transportFactory = new TransportFactory(transportExec, transportPool, transportGroup);
this.classLoader = new RedkaleClassLoader(Thread.currentThread().getContextClassLoader()); this.classLoader = new RedkaleClassLoader(Thread.currentThread().getContextClassLoader());
Thread.currentThread().setContextClassLoader(this.classLoader); Thread.currentThread().setContextClassLoader(this.classLoader);
this.serverClassLoader = new RedkaleClassLoader(this.classLoader);
} }
public ResourceFactory getResourceFactory() { public ResourceFactory getResourceFactory() {
@@ -284,6 +288,10 @@ public final class Application {
return classLoader; return classLoader;
} }
public RedkaleClassLoader getServerClassLoader() {
return serverClassLoader;
}
public List<NodeServer> getNodeServers() { public List<NodeServer> getNodeServers() {
return new ArrayList<>(servers); return new ArrayList<>(servers);
} }

View File

@@ -453,7 +453,7 @@ public final class ClassFilter<T> {
List<URL> urljares = new ArrayList<>(2); List<URL> urljares = new ArrayList<>(2);
final URL exurl = excludeFile != null ? excludeFile.toURI().toURL() : null; final URL exurl = excludeFile != null ? excludeFile.toURI().toURL() : null;
final Pattern[] excludePatterns = toPattern(excludeRegs); final Pattern[] excludePatterns = toPattern(excludeRegs);
for (URL url : loader.getURLs()) { for (URL url : loader.getAllURLs()) {
if (exurl != null && exurl.sameFile(url)) continue; if (exurl != null && exurl.sameFile(url)) continue;
if (excludePatterns != null) { if (excludePatterns != null) {
boolean skip = false; boolean skip = false;

View File

@@ -90,7 +90,7 @@ public abstract class NodeServer {
this.resourceFactory = application.getResourceFactory().createChild(); this.resourceFactory = application.getResourceFactory().createChild();
this.server = server; this.server = server;
this.logger = Logger.getLogger(this.getClass().getSimpleName()); 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); Thread.currentThread().setContextClassLoader(this.classLoader);
} }

View File

@@ -15,22 +15,7 @@ import java.util.HashSet;
public class RedkaleClassLoader extends URLClassLoader { public class RedkaleClassLoader extends URLClassLoader {
public RedkaleClassLoader(ClassLoader parent) { public RedkaleClassLoader(ClassLoader parent) {
super(parentURL(parent), parent); super(new URL[0], parent);
}
private static URL[] parentURL(ClassLoader parent) {
ClassLoader loader = parent;
HashSet<URL> 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()]);
} }
public Class<?> loadClass(String name, byte[] b) { public Class<?> loadClass(String name, byte[] b) {
@@ -47,4 +32,18 @@ public class RedkaleClassLoader extends URLClassLoader {
return super.getURLs(); return super.getURLs();
} }
public URL[] getAllURLs() {
ClassLoader loader = this;
HashSet<URL> 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()]);
}
} }