diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java index 37bab855ffd0..ac16513c0c44 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/FSOperations.java @@ -40,10 +40,7 @@ import org.jetbrains.jps.model.module.JpsModule; import java.io.File; import java.io.FileFilter; import java.io.IOException; -import java.nio.file.FileVisitResult; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.SimpleFileVisitor; +import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.util.HashSet; import java.util.Set; @@ -350,6 +347,30 @@ public class FSOperations { return 0L; } + public static void copy(File fromFile, File toFile) throws IOException { + final Path from = fromFile.toPath(); + final Path to = toFile.toPath(); + try { + try { + Files.copy(from, to, StandardCopyOption.REPLACE_EXISTING); + } + catch (NoSuchFileException e) { + final File parent = toFile.getParentFile(); + if (parent != null && parent.mkdirs()) { + Files.copy(from, to, StandardCopyOption.REPLACE_EXISTING); // repeat on successful target dir creation + } + else { + throw e; + } + } + } + catch (IOException e) { + // fallback: trying 'classic' copying via streams + LOG.info("Error copying "+ fromFile.getPath() + " to " + toFile.getPath() + " with NIO API", e); + FileUtil.copyContent(fromFile, toFile); + } + } + public static boolean isMarkedDirty(CompileContext context, BuildTarget target) { synchronized (TARGETS_COMPLETELY_MARKED_DIRTY) { Set> marked = TARGETS_COMPLETELY_MARKED_DIRTY.get(context); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/resources/ResourcesBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/resources/ResourcesBuilder.java index 5b1e8bf65662..f987d1b595ee 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/resources/ResourcesBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/resources/ResourcesBuilder.java @@ -9,10 +9,7 @@ import org.jetbrains.jps.builders.DirtyFilesHolder; import org.jetbrains.jps.builders.java.ResourceRootDescriptor; import org.jetbrains.jps.builders.java.ResourcesTargetType; import org.jetbrains.jps.builders.storage.BuildDataCorruptedException; -import org.jetbrains.jps.incremental.CompileContext; -import org.jetbrains.jps.incremental.ProjectBuildException; -import org.jetbrains.jps.incremental.ResourcesTarget; -import org.jetbrains.jps.incremental.TargetBuilder; +import org.jetbrains.jps.incremental.*; import org.jetbrains.jps.incremental.messages.BuildMessage; import org.jetbrains.jps.incremental.messages.CompilerMessage; import org.jetbrains.jps.incremental.messages.ProgressMessage; @@ -20,10 +17,6 @@ import org.jetbrains.jps.model.module.JpsModule; import java.io.File; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.NoSuchFileException; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; import java.util.*; /** @@ -118,30 +111,9 @@ public class ResourcesBuilder extends TargetBuilder