是否可以在不重写整个文件的情况下以编程方式更新 Jar 文件?
Can a Jar File be updated programmatically without rewriting the whole file?
可以使用 jar
命令更新 JAR 文件中的单个文件,如下所示:
jar uf TicTacToe.jar images/new.gif
有没有办法以编程方式执行此操作?
如果我使用 JarOutputStream
,我必须重写整个 jar 文件,所以我想知道是否有类似的 "random access" 方法来做到这一点。鉴于它可以使用 jar
工具来完成,我曾期望有一种类似的方式来以编程方式完成它。
可以使用 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 );
}
}
}
是的,如果你使用这个开源库,你也可以用这种方式修改它。
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();
}
}
可以使用 jar
命令更新 JAR 文件中的单个文件,如下所示:
jar uf TicTacToe.jar images/new.gif
有没有办法以编程方式执行此操作?
如果我使用 JarOutputStream
,我必须重写整个 jar 文件,所以我想知道是否有类似的 "random access" 方法来做到这一点。鉴于它可以使用 jar
工具来完成,我曾期望有一种类似的方式来以编程方式完成它。
可以使用 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 );
}
}
}
是的,如果你使用这个开源库,你也可以用这种方式修改它。
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();
}
}