【问题标题】:Can a Jar File be updated programmatically without rewriting the whole file?可以在不重写整个文件的情况下以编程方式更新 Jar 文件吗?
【发布时间】:2015-09-02 12:39:15
【问题描述】:

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

jar uf TicTacToe.jar images/new.gif

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

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

【问题讨论】:

  • 我知道你可以在java中调用批处理。当您想要更新 jar 时,您可以尝试调用该命令。
  • 查看JarFile API。
  • @agad JarFile 不幸的是仅供阅读:(
  • .jar 是存档格式,找个压缩包解压包就好了

标签: java jar


【解决方案1】:

可以使用 Java 7 中提供的 Zip File System Provider 仅更新 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 ); 
        } 
    }
}

【讨论】:

  • 在这种情况下,文件是按照 ZIP 算法的规定压缩的,还是只是简单地添加到存档中?
  • 使用默认压缩级别压缩。
【解决方案2】:

是的,如果你使用这个开源库,你也可以用这种方式修改它。

https://truevfs.java.net

public static void main(String args[]) throws IOException{
    File entry = new TFile("c:/tru6413/server/lib/nxps.jar/dir/second.txt");
    Writer writer = new TFileWriter(entry);
    try {
        writer.write(" this is writing into a file inside an archive");         
    } finally {
        writer.close();
    }       
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-09
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2019-04-03
    • 1970-01-01
    相关资源
    最近更新 更多