Maison  >  Article  >  Java  >  Pourquoi les fichiers JAR créés avec « JarOutputStream » ne parviennent-ils pas à charger les bibliothèques ?

Pourquoi les fichiers JAR créés avec « JarOutputStream » ne parviennent-ils pas à charger les bibliothèques ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-28 19:09:29874parcourir

Why Do JAR Files Created with `JarOutputStream` Fail to Load Libraries?

Problème : divergences dans la création de fichiers JAR à l'aide de JarOutputStream

La création de fichiers JAR par programme à l'aide de java.util.jar.JarOutputStream entraîne souvent des incohérences. Bien que les fichiers JAR produits puissent sembler valides et extractibles, ils rencontrent des problèmes lors du chargement des bibliothèques. Bien qu'il contienne les fichiers requis, Java ne parvient pas à les localiser. Cette différence entre les fichiers JAR générés par programme et ceux créés à l'aide de l'outil de ligne de commande jar de Sun nécessite une compréhension du problème sous-jacent.

Solution : adhérer aux bizarreries non documentées de JarOutputStream

Enquêter sur les subtilités de JarOutputStream révèle trois bizarreries non documentées qui jouent un rôle crucial dans la création réussie de fichiers JAR :

  1. Dénomination des répertoires : les noms de répertoires doivent invariablement se terminer par une barre oblique « / ».
  2. Délimitation du chemin : les chemins dans le fichier JAR doivent utiliser des barres obliques '/' au lieu des barres obliques inverses ''.
  3. Origine de l'entrée : les chemins d'entrée ne doivent jamais commencer par un Barre oblique '/'.

Implémentation révisée :

Pour résoudre ces bizarreries et créer correctement des fichiers JAR, le code suivant illustre l'approche appropriée :

<code class="java">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();
        }
    }
}</code>

En adhérant à ces directives, les fichiers JAR générés par programme refléteront avec précision leur contenu et élimineront les problèmes de chargement rencontrés lors de leur extraction ou de leur utilisation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn