diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/jar/JarHandler.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/jar/JarHandler.java index 41351d9d51c4..2d9b8859177c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/jar/JarHandler.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/jar/JarHandler.java @@ -122,7 +122,11 @@ public class JarHandler extends JarHandlerBase { ) { mirrorFile = new File(new File(getJarsDir()), info.mySnapshotPath); mirrorFileAttributes = FileSystemUtil.getAttributes(mirrorFile); - if (mirrorFileAttributes != null && mirrorFileAttributes.length == originalAttributes.length) { + if (mirrorFileAttributes != null && + mirrorFileAttributes.length == originalAttributes.length && + // no abs, reuse if cached file is older, mirrors can be from different projects with different modification times + (mirrorFileAttributes.lastModified - originalAttributes.lastModified) <= FS_TIME_RESOLUTION + ) { return mirrorFile; } } @@ -166,15 +170,21 @@ public class JarHandler extends JarHandlerBase { mirrorFile = new File(new File(getJarsDir()), getSnapshotName(originalFile.getName(), digest)); mirrorFileAttributes = FileSystemUtil.getAttributes(mirrorFile); - if (mirrorFileAttributes == null) { + if (mirrorFileAttributes == null || + originalAttributes.length != mirrorFileAttributes.length || + mirrorFileAttributes.lastModified - originalAttributes.lastModified > FS_TIME_RESOLUTION // no abs, avoid leaving lately modified mirrors + ) { try { + if (mirrorFileAttributes != null) { + FileUtil.delete(mirrorFile); + } FileUtil.rename(tempJarFile, mirrorFile); + mirrorFile.setLastModified(originalAttributes.lastModified); } catch (IOException ex) { reportIOErrorWithJars(originalFile, mirrorFile, ex); return originalFile; } } else { - assert originalAttributes.length == mirrorFileAttributes.length; FileUtil.delete(tempJarFile); }