in src/main/java/org/apache/maven/plugins/clean/Cleaner.java [209:256]
private boolean fastDelete(Path baseDir) {
// Handle the case where we use ${maven.multiModuleProjectDirectory}/target/.clean for example
if (fastDir.toAbsolutePath().startsWith(baseDir.toAbsolutePath())) {
try {
String prefix = baseDir.getFileName().toString() + ".";
Path tmpDir = Files.createTempDirectory(baseDir.getParent(), prefix);
try {
Files.move(baseDir, tmpDir, StandardCopyOption.REPLACE_EXISTING);
if (session != null) {
session.getData().set(LAST_DIRECTORY_TO_DELETE, baseDir);
}
baseDir = tmpDir;
} catch (IOException e) {
Files.delete(tmpDir);
throw e;
}
} catch (IOException e) {
logger.debug("Unable to fast delete directory", e);
return false;
}
}
// Create fastDir and the needed parents if needed
try {
if (!Files.isDirectory(fastDir)) {
Files.createDirectories(fastDir);
}
} catch (IOException e) {
logger.debug(
"Unable to fast delete directory as the path " + fastDir
+ " does not point to a directory or cannot be created",
e);
return false;
}
try {
Path tmpDir = Files.createTempDirectory(fastDir, "");
Path dstDir = tmpDir.resolve(baseDir.getFileName());
// Note that by specifying the ATOMIC_MOVE, we expect an exception to be thrown
// if the path leads to a directory on another mountpoint. If this is the case
// or any other exception occurs, an exception will be thrown in which case
// the method will return false and the usual deletion will be performed.
Files.move(baseDir, dstDir, StandardCopyOption.ATOMIC_MOVE);
BackgroundCleaner.delete(this, tmpDir, fastMode);
return true;
} catch (IOException e) {
logger.debug("Unable to fast delete directory", e);
return false;
}
}