"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como evitar peculiaridades não documentadas ao usar JarOutputStream para criar arquivos JAR?

Como evitar peculiaridades não documentadas ao usar JarOutputStream para criar arquivos JAR?

Publicado em 2025-01-27
Navegar:531

How to Avoid Undocumented Quirks When Using JarOutputStream to Create JAR Files?

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();
        }
    }
}
Tutorial mais recente Mais>

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