可以在不重写整个文件的情况下以编程方式更新 Jar 文件吗?

Joh*_*lly 6 java jar

可以使用jar如下命令更新 JAR 文件中的单个文件:

jar uf TicTacToe.jar images/new.gif
Run Code Online (Sandbox Code Playgroud)

有没有办法以编程方式做到这一点?

如果我使用JarOutputStream,我必须重写整个 jar 文件,所以我想知道是否有类似的“随机访问”方式来做到这一点。鉴于它可以使用该jar工具完成,我曾期望有一种类似的方式以编程方式完成。

Joh*_*lly 6

可以使用Java 7 中可用的Zip 文件系统提供程序仅更新 JAR 文件的一部分:

import java.net.URI;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.HashMap;
import java.util.Map;

public class ZipFSPUser {
    public static void main(String [] args) throws Throwable {
        Map<String, String> env = new HashMap<>(); 
        env.put("create", "true");
        // locate file system by using the syntax 
        // defined in java.net.JarURLConnection
        URI uri = URI.create("jar:file:/codeSamples/zipfs/zipfstest.zip");

       try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {
            Path externalTxtFile = Paths.get("/codeSamples/zipfs/SomeTextFile.txt");
            Path pathInZipfile = zipfs.getPath("/SomeTextFile.txt");          
            // copy a file into the zip file
            Files.copy( externalTxtFile,pathInZipfile, 
                    StandardCopyOption.REPLACE_EXISTING ); 
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)