From 896764d9de33c899eb277ab3ff286ea4a6cd130c Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 17 Sep 2015 11:09:36 +0200 Subject: [PATCH] avoid complications caused by caching classes from several groovy versions in classpath (IDEA-142818) --- .../jps/incremental/groovy/InProcessGroovyc.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) 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 df2d2a58ac6f..fbcf3e62eff6 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 @@ -48,6 +48,7 @@ import java.util.regex.Pattern; class InProcessGroovyc implements GroovycFlavor { private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.incremental.groovy.InProcessGroovyc"); private static final Pattern GROOVY_ALL_JAR_PATTERN = Pattern.compile("groovy-all(-(.*))?\\.jar"); + private static final Pattern GROOVY_JAR_PATTERN = Pattern.compile("groovy(-(.*))?\\.jar"); private static final ThreadPoolExecutor ourExecutor = ConcurrencyUtil.newSingleThreadExecutor("Groovyc"); private static SoftReference> ourParentLoaderCache; private static final UrlClassLoader.CachePool ourLoaderCachePool = UrlClassLoader.createCachePool(); @@ -192,16 +193,22 @@ class InProcessGroovyc implements GroovycFlavor { return null; } - String groovyAll = ContainerUtil.find(compilationClassPath, new Condition() { + List groovyJars = ContainerUtil.findAll(compilationClassPath, new Condition() { @Override public boolean value(String s) { - return GROOVY_ALL_JAR_PATTERN.matcher(StringUtil.getShortName(s, '/')).matches(); + String fileName = StringUtil.getShortName(s, '/'); + return GROOVY_ALL_JAR_PATTERN.matcher(fileName).matches() || GROOVY_JAR_PATTERN.matcher(fileName).matches(); } }); - if (groovyAll == null) { + + LOG.debug("Groovy jars: " + groovyJars); + + if (groovyJars.size() != 1 || !GROOVY_ALL_JAR_PATTERN.matcher(groovyJars.get(0)).matches()) { + // avoid complications caused by caching classes from several groovy versions in classpath return null; } + String groovyAll = groovyJars.get(0); Pair pair = SoftReference.dereference(ourParentLoaderCache); if (pair != null && pair.first.equals(groovyAll)) { return pair.second;