use UrlClassLoader for speedier teamcity test initialization

This commit is contained in:
peter
2016-09-19 12:04:52 +02:00
parent 66f58bbf75
commit 35e27f05e9
@@ -28,14 +28,7 @@ import java.util.LinkedHashSet;
/**
* @author max
*/
public class ExternalClasspathClassLoader extends URLClassLoader {
static {
registerAsParallelCapable();
}
private ExternalClasspathClassLoader(URL[] urls) {
super(urls, Thread.currentThread().getContextClassLoader());
}
public class ExternalClasspathClassLoader {
private static String[] parseUrls(String classpathFilePath) {
Collection<String> roots = new LinkedHashSet<>();
@@ -79,7 +72,9 @@ public class ExternalClasspathClassLoader extends URLClassLoader {
try {
URL[] urls = parseUrls();
if (urls != null) {
Thread.currentThread().setContextClassLoader(new ExternalClasspathClassLoader(urls));
URLClassLoader auxLoader = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());
Thread.currentThread().setContextClassLoader(auxLoader);
Thread.currentThread().setContextClassLoader(loadOptimizedLoader(urls, auxLoader));
}
}
catch (Exception e) {
@@ -87,6 +82,16 @@ public class ExternalClasspathClassLoader extends URLClassLoader {
}
}
private static ClassLoader loadOptimizedLoader(Object urls, URLClassLoader auxLoader) throws Exception {
Object builder = auxLoader.loadClass("com.intellij.util.lang.UrlClassLoader").getMethod("build").invoke(null);
builder.getClass().getMethod("urls", URL[].class).invoke(builder, urls);
builder.getClass().getMethod("useCache").invoke(builder);
builder.getClass().getMethod("allowLock").invoke(builder);
builder.getClass().getMethod("allowBootstrapResources").invoke(builder);
builder.getClass().getMethod("parent", ClassLoader.class).invoke(builder, auxLoader.getParent());
return (ClassLoader)builder.getClass().getMethod("get").invoke(builder);
}
private static URL[] parseUrls() {
try {
String[] roots = getRoots();