From 35e27f05e93d71684bca6b0965bfcde36ae5d0d4 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 19 Sep 2016 11:41:02 +0200 Subject: [PATCH] use UrlClassLoader for speedier teamcity test initialization --- .../tests/ExternalClasspathClassLoader.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/platform/testFramework/bootstrap/src/com/intellij/tests/ExternalClasspathClassLoader.java b/platform/testFramework/bootstrap/src/com/intellij/tests/ExternalClasspathClassLoader.java index c780281b0862..18599b74967e 100644 --- a/platform/testFramework/bootstrap/src/com/intellij/tests/ExternalClasspathClassLoader.java +++ b/platform/testFramework/bootstrap/src/com/intellij/tests/ExternalClasspathClassLoader.java @@ -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 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();