Criando arquivos JAR usando JarOutputStream
Para gerar um arquivo JAR programaticamente, JarOutputStream é frequentemente empregado. No entanto, é essencial evitar certas peculiaridades não documentadas no JarOutputStream:
1. Diretórios que terminam com uma barra:
Nomes de diretórios em arquivos JAR devem terminar com uma barra '/'.
2. Caminhos usando barras:
Use barras '/' em caminhos, em vez de barras invertidas '\'.
3. Sem barras iniciais nos nomes das entradas:
Os nomes das entradas não devem começar com uma barra '/'.
Exemplo de código com correções:
O seguinte código corrigido constrói um arquivo JAR válido com um arquivo de manifesto:
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 {
String name = source.getPath().replace("\\", "/");
if (source.isDirectory()) {
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);
}
} else {
JarEntry entry = new JarEntry(name);
entry.setTime(source.lastModified());
target.putNextEntry(entry);
try (BufferedInputStream 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();
}
}
}
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3