事实证明,这JarOutputStream有三个未记录的怪癖:
- 目录名称必须以“ /”斜杠结尾。
- 路径必须使用“ /”斜杠,而不是“ ”
- 条目不能以“ /”斜杠开头。
这是创建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(); }}


