"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 problemas inesperados ao criar arquivos JAR com JarOutputStream do Java?

Como evitar problemas inesperados ao criar arquivos JAR com JarOutputStream do Java?

Publicado em 2024-11-09
Navegar:397

How to Avoid Unexpected Issues While Creating JAR Files with Java\'s JarOutputStream?

Solução de problemas de JarOutputStream para criação de arquivo JAR

Criar arquivos JAR programaticamente usando java.util.jar.JarOutputStream pode parecer simples, mas certas nuances podem levar a problemas inesperados. Este artigo explora essas peculiaridades não documentadas e fornece uma solução abrangente para a criação de arquivos JAR válidos.

Compreendendo as peculiaridades

Ao usar JarOutputStream, é crucial aderir às seguintes regras não documentadas:

  • Os nomes dos diretórios devem terminar com uma barra '/'.
  • Os caminhos devem usar barras '/', não '\'.
  • As entradas não podem começar com uma barra '/' .

Implementando a abordagem correta

Aqui está um exemplo detalhado de como criar um arquivo JAR com um arquivo de manifesto, abordando as peculiaridades mencionadas acima:

public void run() throws IOException {
    // Prepare the manifest file
    Manifest manifest = new Manifest();
    manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");

    // Create a new JAROutputStream with the manifest
    JarOutputStream target = new JarOutputStream(new FileOutputStream("output.jar"), manifest);

    // Iterate over the source directory and add files to the JAR
    add(new File("inputDirectory"), target);

    // Close the JAROutputStream
    target.close();
}

private void add(File source, JarOutputStream target) throws IOException {
    // Prepare the entry path
    String name = source.getPath().replace("\\", "/");

    // Handle directories
    if (source.isDirectory()) {
        if (!name.endsWith("/")) {
            name  = "/";
        }
        // Create a directory entry with appropriate timestamps
        JarEntry entry = new JarEntry(name);
        entry.setTime(source.lastModified());
        target.putNextEntry(entry);
        target.closeEntry();

        // Recursively add files within the directory
        for (File nestedFile : source.listFiles()) {
            add(nestedFile, target);
        }
    } 
    // Handle files
    else {
        // Create a file entry with appropriate timestamps
        JarEntry entry = new JarEntry(name);
        entry.setTime(source.lastModified());
        target.putNextEntry(entry);

        // Read and write the file contents to the JAR
        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();
        }
    }
}

Seguindo essas diretrizes, agora você pode criar com segurança arquivos JAR válidos de forma programática, garantindo que as bibliotecas e outros recursos incluídos neles sejam acessíveis conforme pretendido.

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