From 23ab8636c5d11b5d76fadd8d5be1a57ea5c5573c Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 18 Dec 2017 09:40:57 +0100 Subject: [PATCH] IDEA-182825 Unable to compile groovy with JDK 9 use platform class loader as parent also when there's no groovy-all.jar --- .../com/intellij/openapi/util/ClassLoaderUtil.java | 13 ++++++++++--- .../jps/incremental/groovy/InProcessGroovyc.java | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/platform/util/src/com/intellij/openapi/util/ClassLoaderUtil.java b/platform/util/src/com/intellij/openapi/util/ClassLoaderUtil.java index 9d72f48c51b7..6762929d0707 100644 --- a/platform/util/src/com/intellij/openapi/util/ClassLoaderUtil.java +++ b/platform/util/src/com/intellij/openapi/util/ClassLoaderUtil.java @@ -18,6 +18,7 @@ package com.intellij.openapi.util; import com.intellij.util.ThrowableRunnable; import com.intellij.util.lang.UrlClassLoader; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class ClassLoaderUtil { private ClassLoaderUtil() { @@ -69,16 +70,22 @@ public class ClassLoaderUtil { } } - public static void addPlatformLoaderParentIfOnJdk9(@NotNull UrlClassLoader.Builder builder) { + @Nullable + public static ClassLoader getPlatformLoaderParentIfOnJdk9() { if (SystemInfo.IS_AT_LEAST_JAVA9) { // on Java 8, 'tools.jar' is on a classpath; on Java 9, its classes are available via the platform loader try { - ClassLoader platformCl = (ClassLoader)ClassLoader.class.getMethod("getPlatformClassLoader").invoke(null); - builder.parent(platformCl); + //noinspection JavaReflectionMemberAccess + return (ClassLoader)ClassLoader.class.getMethod("getPlatformClassLoader").invoke(null); } catch (Exception e) { throw new RuntimeException(e); } } + return null; + } + + public static void addPlatformLoaderParentIfOnJdk9(@NotNull UrlClassLoader.Builder builder) { + builder.parent(getPlatformLoaderParentIfOnJdk9()); } } diff --git a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/InProcessGroovyc.java b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/InProcessGroovyc.java index 6d6803723807..e28b211383c7 100644 --- a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/InProcessGroovyc.java +++ b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/InProcessGroovyc.java @@ -175,11 +175,11 @@ class InProcessGroovyc implements GroovycFlavor { private JointCompilationClassLoader createCompilationClassLoader(Collection compilationClassPath) throws Exception { ClassLoader parent = obtainParentLoader(compilationClassPath); - ClassLoader groovyClassLoader = null; + ClassLoader groovyClassLoader; try { ClassLoader auxiliary = parent != null ? parent : buildCompilationClassLoader(compilationClassPath, null).get(); Class gcl = auxiliary.loadClass("groovy.lang.GroovyClassLoader"); - groovyClassLoader = (ClassLoader)gcl.getConstructor(ClassLoader.class).newInstance(parent); + groovyClassLoader = (ClassLoader)gcl.getConstructor(ClassLoader.class).newInstance(parent != null ? parent : ClassLoaderUtil.getPlatformLoaderParentIfOnJdk9()); } catch (ClassNotFoundException e) { return null;