From 8ca9a699a4feaffe0726dd04e433a7ad1ce2af92 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Fri, 27 Nov 2015 13:48:15 +0100 Subject: [PATCH] [platform] moves Java extension directories to the end of the classpath (ZD-79286) Expected to fix crashes and license activation problems caused by users messing with Java extension directories. --- .../ide/BootstrapClassLoaderUtil.java | 40 ++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/platform/bootstrap/src/com/intellij/ide/BootstrapClassLoaderUtil.java b/platform/bootstrap/src/com/intellij/ide/BootstrapClassLoaderUtil.java index 349f7e1fe19c..574f6befa49a 100644 --- a/platform/bootstrap/src/com/intellij/ide/BootstrapClassLoaderUtil.java +++ b/platform/bootstrap/src/com/intellij/ide/BootstrapClassLoaderUtil.java @@ -20,7 +20,6 @@ import com.intellij.idea.Main; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.util.containers.ContainerUtil; import com.intellij.util.lang.UrlClassLoader; import com.intellij.util.text.StringTokenizer; import org.jetbrains.annotations.NotNull; @@ -28,6 +27,7 @@ import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; +import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; import java.util.*; @@ -52,9 +52,10 @@ public class BootstrapClassLoaderUtil extends ClassUtilCore { PathManager.loadProperties(); Collection classpath = new LinkedHashSet(); - addParentClasspath(classpath); + addParentClasspath(classpath, false); addIDEALibraries(classpath); addAdditionalClassPath(classpath); + addParentClasspath(classpath, true); UrlClassLoader.Builder builder = UrlClassLoader.build() .urls(filterClassPath(new ArrayList(classpath))) @@ -81,7 +82,10 @@ public class BootstrapClassLoaderUtil extends ClassUtilCore { return newClassLoader; } - private static void addParentClasspath(Collection classpath) throws MalformedURLException { + private static void addParentClasspath(Collection classpath, boolean ext) throws MalformedURLException { + String[] extDirs = System.getProperty("java.ext.dirs", "").split(File.pathSeparator); + if (ext && extDirs.length == 0) return; + List loaders = new ArrayList(2); for (ClassLoader loader = BootstrapClassLoaderUtil.class.getClassLoader(); loader != null; loader = loader.getParent()) { if (loader instanceof URLClassLoader) { @@ -91,8 +95,33 @@ public class BootstrapClassLoaderUtil extends ClassUtilCore { getLogger().warn("Unknown class loader: " + loader.getClass().getName()); } } + for (URLClassLoader loader : loaders) { - ContainerUtil.addAll(classpath, loader.getURLs()); + URL[] urls = loader.getURLs(); + for (URL url : urls) { + String path = urlToPath(url); + + boolean isExt = false; + for (String extDir : extDirs) { + if (path.startsWith(extDir)) { + isExt = true; + break; + } + } + + if (isExt == ext) { + classpath.add(url); + } + } + } + } + + private static String urlToPath(URL url) throws MalformedURLException { + try { + return new File(url.toURI()).getPath(); + } + catch (URISyntaxException e) { + throw new MalformedURLException(url.toString()); } } @@ -136,6 +165,7 @@ public class BootstrapClassLoaderUtil extends ClassUtilCore { } } + @SuppressWarnings("Duplicates") private static List filterClassPath(List classpath) { String ignoreProperty = System.getProperty(PROPERTY_IGNORE_CLASSPATH); if (ignoreProperty != null) { @@ -149,4 +179,4 @@ public class BootstrapClassLoaderUtil extends ClassUtilCore { } return classpath; } -} +} \ No newline at end of file