summaryrefslogtreecommitdiff
path: root/jps/jps-builders/src/org/jetbrains/jps/javac/JavacMain.java
diff options
context:
space:
mode:
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.java55
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;
+ }
+ }
+ }
+
+
}