Heim  >  Artikel  >  Java  >  Warum können mit „JarOutputStream“ erstellte JAR-Dateien keine Bibliotheken laden?

Warum können mit „JarOutputStream“ erstellte JAR-Dateien keine Bibliotheken laden?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-28 19:09:29874Durchsuche

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

Problem: Diskrepanzen bei der JAR-Dateierstellung mit JarOutputStream

Das programmgesteuerte Erstellen von JAR-Dateien mit java.util.jar.JarOutputStream führt häufig zu Inkonsistenzen. Auch wenn die erzeugten JAR-Dateien gültig und extrahierbar erscheinen, treten beim Laden von Bibliotheken Probleme auf. Obwohl die erforderlichen Dateien enthalten sind, kann Java diese nicht finden. Diese Diskrepanz zwischen programmgesteuert generierten JAR-Dateien und solchen, die mit dem JAR-Befehlszeilentool von Sun erstellt wurden, erfordert ein Verständnis des zugrunde liegenden Problems.

Lösung: Einhaltung undokumentierter Macken von JarOutputStream

Untersuchung der Feinheiten von JarOutputStream enthüllt drei undokumentierte Macken, die eine entscheidende Rolle bei der erfolgreichen Erstellung von JAR-Dateien spielen:

  1. Verzeichnisbenennung: Verzeichnisnamen müssen immer mit einem Schrägstrich „/“ enden.
  2. Pfadtrennung: Pfade innerhalb der JAR-Datei müssen Schrägstriche „/“ anstelle von Backslashes „“ verwenden.
  3. Eintragsursprung: Eintragspfade sollten niemals mit a beginnen '/' Schrägstrich.

Überarbeitete Implementierung:

Um diese Macken zu beheben und JAR-Dateien korrekt zu erstellen, demonstriert der folgende Code den geeigneten Ansatz:

<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>

Durch die Einhaltung dieser Richtlinien geben programmgesteuert generierte JAR-Dateien ihren Inhalt genau wieder und beseitigen Ladeprobleme, die beim Extrahieren oder Verwenden auftreten.

Das obige ist der detaillierte Inhalt vonWarum können mit „JarOutputStream“ erstellte JAR-Dateien keine Bibliotheken laden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn