有人可以推荐使用Java库来操作 jar 文件吗?我发现 java.util.jar 提供的设施相当简洁(或者我可能没有一些示例代码可供查看)。我对以下内容感兴趣:
如果有人可以使用 java.util.jar 或其他一些有用的库指向示例代码。特别是在查看 java.util.jar 的类和方法时,我不清楚如何读取特定Jar条目的内容,甚至不知道如何缩小 jar (不产生外部过程)。
答案 0 :(得分:2)
一个jar只是一个zip file with a different extension(和一个清单),所以你可能会对像zip4j或java.util.zip这样的zip库感兴趣。
答案 1 :(得分:2)
1& 2是简单的手动操作,将条目从Jar复制到另一个添加或留下您想要的条目,删除原始文件并重命名新文件以替换它。
正如jtahlbom指出的那样,Java Jar API可以开箱即用。
更新示例
这些是非常基本的例子。它们向您展示如何读取和编写Jar。基本上,你可以从中得到你需要做的其他事情。
我已经设置了一个个人图书馆(不包括在内),它基本上允许我传入InputStream
并将其写入OutputStream
,反之亦然。这意味着您可以从任何地方读取并写入任何地方,这可以满足您的大多数要求。
public void unjar(File jar, File outputPath) throws IOException {
JarFile jarFile = null;
try {
if (outputPath.exits() || outputPathFile.mkdirs()) {
jarFile = new JarFile(jar);
Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
File path = new File(outputPath + File.separator + entry.getName());
if (entry.isDirectory()) {
if (!path.exists() && !path.mkdirs()) {
throw new IOException("Failed to create output path " + path);
}
} else {
System.out.println("Extracting " + path);
InputStream is = null;
OutputStream os = null;
try {
is = jarFile.getInputStream(entry);
os = new FileOutputStream(path);
byte[] byteBuffer = new byte[1024];
int bytesRead = -1;
while ((bytesRead = is.read(byteBuffer)) != -1) {
os.write(byteBuffer, 0, bytesRead);
}
os.flush();
} finally {
try {
os.close();
} catch (Exception e) {
}
try {
is.close();
} catch (Exception e) {
}
}
}
}
} else {
throw IOException("Output path does not exist/could not be created");
}
} finally {
try {
jarFile.close();
} catch (Exception e) {
}
}
}
public void jar(File jar, File sourcePath) throws IOException {
JarOutputStream jos = null;
try {
jos = new JarOutputStream(new FileOutputStream(jar));
List<File> fileList = getFiles(sourcePath);
System.out.println("Jaring " + fileList.size() + " files");
List<String> lstPaths = new ArrayList<String>(25);
for (File file : fileList) {
String path = file.getParent().replace("\\", "/");
String name = file.getName();
path = path.substring(sourcePath.getPath().length());
if (path.startsWith("/")) {
path = path.substring(1);
}
if (path.length() > 0) {
path += "/";
if (!lstPaths.contains(path)) {
JarEntry entry = new JarEntry(path);
jos.putNextEntry(entry);
jos.closeEntry();
lstPaths.add(path);
}
}
System.out.println("Adding " + path + name);
JarEntry entry = new JarEntry(path + name);
jos.putNextEntry(entry);
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
byte[] byteBuffer = new byte[1024];
int bytesRead = -1;
while ((bytesRead = fis.read(byteBuffer)) != -1) {
jos.write(byteBuffer, 0, bytesRead);
}
jos.flush();
} finally {
try {
fis.close();
} catch (Exception e) {
}
}
jos.closeEntry();
}
jos.flush();
} finally {
try {
jos.close();
} catch (Exception e) {
}
}
}
如果你花点时间看一下,有很多关于如何在SO上添加/删除来自zip / jar文件的条目的例子
答案 2 :(得分:1)
TrueZip似乎是一个非常全面的zip库。
顺便说一句,我很确定jdk jar API可以很容易地处理3-7。
答案 3 :(得分:0)
也许Apache Commons Compress可以帮到你。