This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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()]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user