关于在war中更改文件的java.nio.file.FileAlreadyExistsException

时间:2016-09-01 07:59:11

标签: java

在我的战争中改变 context.xml 时,我很难获得java.nio.file.FileAlreadyExistsException

执行此操作的方法:

public static void replaceFileInZip(final File zipArchive, final String externalFilePath, final String zipFilePath) {
    Map<String, String> env = new HashMap<>();
    env.put("create", "true");
    Path path = Paths.get(zipArchive.getPath());
    URI uri = URI.create("jar:" + path.toUri());
    try (FileSystem fs = FileSystems.newFileSystem(uri, env)) {
        Path externalContext = Paths.get(externalFilePath);
        Path pathContextInArchive = fs.getPath(zipFilePath);
        Files.copy(externalContext, pathContextInArchive, StandardCopyOption.REPLACE_EXISTING);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我使用 StandardCopyOption.REPLACE_EXISTING ,然后好于99,然而,有时我会遇到异常:

java.nio.file.FileAlreadyExistsException: D:\temp\Tomcat\webapps\zipfstmp8401293639854380654.tmp -> D:\temp\Tomcat\webapps\mywar.war
at sun.nio.fs.WindowsException.translateToIOException(Unknown Source)
at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
at sun.nio.fs.WindowsFileCopy.move(Unknown Source)
at sun.nio.fs.WindowsFileSystemProvider.move(Unknown Source)
at java.nio.file.Files.move(Unknown Source)
at com.sun.nio.zipfs.ZipFileSystem.sync(ZipFileSystem.java:1297)
at com.sun.nio.zipfs.ZipFileSystem.close(ZipFileSystem.java:277)
at com.hryhorii.installer.controllers.service.ZipService.replaceFileInZip(ZipService.java:170)
at com.hryhorii.installer.controllers.flow.AbstractFlow.replaceContextInWar(AbstractFlow.java:120)
at com.hryhorii.installer.controllers.flow.AbstractFlow.copyApp(AbstractFlow.java:97)
at com.hryhorii.installer.controllers.flow.InstallFlow.process(InstallFlow.java:20)
at com.hryhorii.installer.controllers.ui.InstallPageController$4$1.call(InstallPageController.java:254)
at com.hryhorii.installer.controllers.ui.InstallPageController$4$1.call(InstallPageController.java:247)
at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
at java.util.concurrent.FutureTask.run(Unknown Source)
at javafx.concurrent.Service.lambda$null$492(Service.java:725)
at java.security.AccessController.doPrivileged(Native Method)
at javafx.concurrent.Service.lambda$executeTask$493(Service.java:724)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

据我所知,tmp文件是在文件被压缩时创建的,所以看起来这个tmp文件必须被删除。此外,我无法调试此问题,因为当我在while(true)循环中运行此方法时,它不会发生。

修改

看起来每次都正确替换上下文文件。当改变战争试图取代旧战争时,问题就会出现。

0 个答案:

没有答案