如何使用JarOutputStream創(chuàng)建JAR文件?如何使用編程方式創(chuàng)建JAR文件java.util.jar.JarOutputStream?我的程序生成的JAR文件看起來是正確的(它提取正常)但是當(dāng)我嘗試從中加載庫時,Java抱怨它無法找到明確存儲在其中的文件。如果我提取JAR文件并使用Sun的jar命令行工具重新壓縮它,則生成的庫可以正常工作。簡而言之,我的JAR文件有問題。請解釋如何以編程方式創(chuàng)建JAR文件,并使用清單文件。
3 回答

九州編程
TA貢獻1785條經(jīng)驗 獲得超4個贊
事實證明,這JarOutputStream
有三個未記載的怪癖:
目錄名稱必須以“/”斜杠結(jié)尾。
路徑必須使用'/'斜杠,而不是'\'
條目不能以“/”斜杠開頭。
以下是創(chuàng)建Jar文件的正確方法:
public void run() throws IOException{ Manifest manifest = new Manifest(); manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0"); JarOutputStream target = new JarOutputStream(new FileOutputStream("output.jar"), manifest); add(new File("inputDirectory"), target); target.close();}private void add(File source, JarOutputStream target) throws IOException{ BufferedInputStream in = null; try { if (source.isDirectory()) { String name = source.getPath().replace("\\", "/"); if (!name.isEmpty()) { if (!name.endsWith("/")) name += "/"; JarEntry entry = new JarEntry(name); entry.setTime(source.lastModified()); target.putNextEntry(entry); target.closeEntry(); } for (File nestedFile: source.listFiles()) add(nestedFile, target); return; } JarEntry entry = new JarEntry(source.getPath().replace("\\", "/")); entry.setTime(source.lastModified()); target.putNextEntry(entry); in = new BufferedInputStream(new FileInputStream(source)); byte[] buffer = new byte[1024]; while (true) { int count = in.read(buffer); if (count == -1) break; target.write(buffer, 0, count); } target.closeEntry(); } finally { if (in != null) in.close(); }}

MM們
TA貢獻1886條經(jīng)驗 獲得超2個贊
還有一個需要注意的“怪癖”:所有JarEntry的名字都不應(yīng)以“/”開頭。
例如:清單文件的jar條目名稱是“META-INF / MANIFEST.MF”而不是“/META-INF/MANIFEST.MF”。
所有jar條目都應(yīng)遵循相同的規(guī)則。
添加回答
舉報
0/150
提交
取消