diff options
Diffstat (limited to 'jps/jps-builders/src/org/jetbrains/jps/javac/JavacMain.java')
-rw-r--r-- | jps/jps-builders/src/org/jetbrains/jps/javac/JavacMain.java | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/jps/jps-builders/src/org/jetbrains/jps/javac/JavacMain.java b/jps/jps-builders/src/org/jetbrains/jps/javac/JavacMain.java index c5b6d861a8e4..ac4f4a0b78fc 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/javac/JavacMain.java +++ b/jps/jps-builders/src/org/jetbrains/jps/javac/JavacMain.java @@ -452,4 +452,59 @@ public class JavacMain { } } + private static class ZipFileIndexCleanupDataHolder { + @Nullable + static final Method cacheInstanceGetter; + @Nullable + static final Method cacheClearMethod; + + static { + Method getterMethod = null; + Method clearMethod = null; + try { + //trying JDK 6 + clearMethod = Class.forName("com.sun.tools.javac.zip.ZipFileIndex").getDeclaredMethod("clearCache"); + clearMethod.setAccessible(true); + } + catch (Throwable e) { + try { + final Class<?> cacheClass = Class.forName("com.sun.tools.javac.file.ZipFileIndexCache"); + clearMethod = cacheClass.getDeclaredMethod("clearCache"); + getterMethod = cacheClass.getDeclaredMethod("getSharedInstance"); + clearMethod.setAccessible(true); + getterMethod.setAccessible(true); + } + catch (Throwable ignored2) { + clearMethod = null; + getterMethod = null; + } + } + + cacheInstanceGetter = getterMethod; + cacheClearMethod = clearMethod; + } + } + + private static volatile boolean zipCacheCleanupPossible = true; + + public static void clearCompilerZipFileCache() { + if (zipCacheCleanupPossible) { + final Method clearMethod = ZipFileIndexCleanupDataHolder.cacheClearMethod; + if (clearMethod != null) { + final Method getter = ZipFileIndexCleanupDataHolder.cacheInstanceGetter; + try { + Object instance = getter != null? getter.invoke(null) : null; + clearMethod.invoke(instance); + } + catch (Throwable e) { + zipCacheCleanupPossible = false; + } + } + else { + zipCacheCleanupPossible = false; + } + } + } + + } |