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
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<NodeServer> getNodeServers() {
return new ArrayList<>(servers);
}

View File

@@ -453,7 +453,7 @@ public final class ClassFilter<T> {
List<URL> 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;

View File

@@ -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);
}

View File

@@ -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<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()]);
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<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()]);
}
}