Wie lassen sich der Inhalt eines *.jar-Archivs und die Einträge im Manifest auslesen?

Die Klasse JarFile ist abgeleitet von ZipFile und stellt zusätzliche Methoden bereit, um die Einträge eines *jar-Archivs zu ermitteln.

Innerhalb des Konstruktors der Beispielklasse ist ein try-catch-Block deklariert, der notwendig ist, um eventuelle Ein-Ausgabe-Fehler beim Lesen der Jar-Datei abzufangen. Mittels des absoluten Pfades zum Archiv wird in ihm zunächst ein JarFile-Objekt erzeugt, dessen Einträge durch die Methode entries() in eine Enumeration eingelesen werden. Über sie wird iteriert und für jeden Eintrag mit getName() der Name ermittelt und ausgegeben.

import java.io.IOException;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class JarLesen {

    public JarLesen() {
        String path = "meineJar.jar";
        JarFile jFile = null;
        JarEntry jEntry = null;
        Entry<?, ?> entry = null;
        try {
            jFile = new JarFile(path);
            
            Enumeration<JarEntry> jEntries = jFile.entries();
            while(jEntries.hasMoreElements()){
                jEntry = jEntries.nextElement();
                System.out.println(jEntry.getName());
            }
            
            Set<?> set = jFile.getManifest().getMainAttributes().entrySet();
            Iterator<?> it = set.iterator();
            while (it.hasNext()) {
                entry = (Entry<?, ?>) (it.next());
                System.out.println(entry);
                String key = entry.getKey().toString();
                String value = entry.getValue().toString();
                System.out.println("Key: " + key + ", Value: " + value + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new JarLesen();
    }
}

Um auf die Manifesteinträge zuzugreifen, wird als erstes das Manifest selbst mit der Methode JarFile.getManifest() ermittelt. Seinem Manifest-Objekt lassen sich mit getMainAttributes() die Attribute entlocken. Sie stellen Schlüssel-Wert-Paare dar, die zur Aufschlüsselung in ein Set gelesen werden. Bei einem Set (Menge) handelt es sich um ein Interface, das von Collection abgeleitet ist und eine ungeordnete Sammlung darstellt, die keine doppelten Einträge enthält. Die Methode iterator() gibt ein Iterator-Objekt zurück, mit dem die Menge durchlaufen werden kann. Sie enthält Entry-Elemente, deren Schlüssel mit Hilfe von getKey() und deren Werte mit getValue() ausgelesen werden können.