web-dev-qa-db-de.com

Wie bekomme ich Namen von Klassen in einer Jar-Datei?

Ich habe eine JAR-Datei und muss den Namen aller Klassen in dieser JAR-Datei abrufen. Wie kann ich das machen?

Ich habe gegoogelt und etwas über JarFile oder Java ClassLoader gesehen, aber ich habe keine Ahnung, wie es geht.

93
sticksu

Leider bietet Java keine einfache Möglichkeit, Klassen in der "nativen" JRE aufzulisten. Sie haben also eine Reihe von Optionen: (a) Für eine bestimmte JAR-Datei können Sie die Einträge in dieser JAR-Datei auflisten, die .class-Dateien suchen und dann ermitteln, welche Java-Klasse jede .class-Datei darstellt. oder (b) Sie können eine Bibliothek verwenden, die dies für Sie erledigt.

Option (a): Manuelles Scannen von JAR-Dateien

In dieser Option füllen wir classNames mit der Liste aller Java-Klassen, die in einer JAR-Datei enthalten sind, unter /path/to/jar/file.jar.

List<String> classNames = new ArrayList<String>();
ZipInputStream Zip = new ZipInputStream(new FileInputStream("/path/to/jar/file.jar"));
for (ZipEntry entry = Zip.getNextEntry(); entry != null; entry = Zip.getNextEntry()) {
    if (!entry.isDirectory() && entry.getName().endsWith(".class")) {
        // This ZipEntry represents a class. Now, what class does it represent?
        String className = entry.getName().replace('/', '.'); // including ".class"
        classNames.add(className.substring(0, className.length() - ".class".length()));
    }
}

Option (b): Verwendung spezieller Reflexionsbibliotheken

Guave

Guava hatte ClassPath seit mindestens 14.0, was ich verwendet und gemocht habe. Das Schöne an ClassPath ist, dass die gefundenen Klassen nicht geladen werden, was beim Scannen nach einer großen Anzahl von Klassen wichtig ist.

ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());
for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")) {
    // Do stuff with classes here...
}

Reflexionen

Die Reflections-Bibliothek habe ich nicht persönlich verwendet, aber es scheint sehr beliebt zu sein. Auf der Website finden Sie einige großartige Beispiele, wie diese schnelle Methode zum Laden aller Klassen in einem von der any - JAR-Datei bereitgestellten Paket, das für Ihre Anwendung ebenfalls nützlich sein kann.

Reflections reflections = new Reflections("my.project.prefix");

Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);

Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);
61
sigpwned

Sie können das Java-Tool jar verwenden. Listen Sie den Inhalt der JAR-Datei in einer TXT-Datei auf, und Sie können alle Klassen im JAR sehen.

jar tvf jarfile.jar
150
Sanjeev Gupta

Vielleicht suchen Sie nach dem Befehl jar, um die Liste der Klassen im Terminal abzurufen. 

$ jar tf ~/.m2/repository/org/Apache/spark/spark-Assembly/1.2.0-SNAPSHOT/spark-Assembly-1.2.0-SNAPSHOT-hadoop1.0.4.jar 
META-INF/
META-INF/MANIFEST.MF
org/
org/Apache/
org/Apache/spark/
org/Apache/spark/unused/
org/Apache/spark/unused/UnusedStubClass.class
META-INF/maven/
META-INF/maven/org.spark-project.spark/
META-INF/maven/org.spark-project.spark/unused/
META-INF/maven/org.spark-project.spark/unused/pom.xml
META-INF/maven/org.spark-project.spark/unused/pom.properties
META-INF/NOTICE

woher, 

-t  list table of contents for archive
-f  specify archive file name

Oder greife einfach über das Ergebnis, um nur .classes zu sehen

$ jar tf ~/.m2/repository/org/Apache/spark/spark-Assembly/1.2.0-SNAPSHOT/spark-Assembly-1.2.0-SNAPSHOT-hadoop1.0.4.jar | grep .class
org/Apache/spark/unused/UnusedStubClass.class

Um die Anzahl der classes anzuzeigen, 

jar tvf launcher/target/usergrid-launcher-1.0-SNAPSHOT.jar | grep .class | wc -l
61079
18
prayagupd

Dies ist ein Hack, den ich benutze:

Sie können die automatische Vervollständigung von Java folgendermaßen verwenden:

Java -cp path_to.jar <Tab>

Dadurch erhalten Sie eine Liste von Klassen, die als Startklasse verfügbar sind. Wenn Sie versuchen, eine Datei zu verwenden, die keine Hauptdatei hat, wird dies natürlich nichts bewirken. Sie können jedoch sehen, was Java denkt, dass die Klassen innerhalb von .jar aufgerufen werden.

9
stanm

Du kannst den ... benutzen 

jar tf example.jar
6
Achyuth

Der folgende Befehl listet den Inhalt einerjar-Datei auf. 

befehl: - unzip -l jarfilename.jar.

probe o/p: - 

Archive: hello-world.jar Length Date Time Name --------- ---------- ----- ---- 43161 10-18-2017 15:44 hello-world/com/AMI/so/search/So.class 20531 10-18-2017 15:44 hello-world/com/AMI/so/util/SoUtil.class --------- ------- 63692 2 files

Laut Handbuch von unzip 

-l listet Archivdateien auf (kurzes Format). Die Namen, unkomprimierten Dateigrößen sowie Datum und Uhrzeit der Änderung der angegebenen Dateien lauten gedruckt, zusammen mit Summen für alle Dateien angegeben. Wenn UnZip mit definiertem OS2_EAS kompiliert wurde, listet die Option -l auch Spalten für die Größen von OS/2 .__ auf. erweiterte Attribute (EAs) und OS/2-Zugriff Kontrolllisten (ACLs). Außerdem werden der zip-Dateikommentar und einzelne Dateikommentare (falls vorhanden) angezeigt. Wenn eine Datei .__ war. Archiviert aus einem Einzelfall-Dateisystem (zum Beispiel das alte MS-DOS-FAT-Dateisystem) und die Option -L angegeben wurde, wird der Dateiname in Kleinbuchstaben konvertiert und lautet vorangestellt mit einem Caret (^).

5
Amit Khandelwal

Du kannst es versuchen:

jar tvf jarfile.jar 

Dies ist nur hilfreich, wenn Ihr jar ausführbar ist, d. H. Sie haben im Manifest eine Klasse als Hauptklasse definiert

4
Pallav

Sie können dies versuchen:

unzip -v /your/jar.jar

Dies ist nur hilfreich, wenn Ihr jar ausführbar ist, d. H. Sie haben im Manifest eine Klasse als Hauptklasse definiert

2
Abhimanyu Dutta

Description OF Solution : Eclipse IDE kann hierfür verwendet werden, indem ein Beispiel-Java-Projekt erstellt und alle Jars in den Projekterstellungspfad eingefügt werden

SCHRITTE unten :

  1. Erstellen Sie ein Eclipse-Java-Beispielprojekt.

  2. Alle Gläser, die Sie in Ihrem Build-Pfad haben

  3. STRG + UMSCHALT + T und geben Sie den vollständigen Klassennamen ein.

  4. Die Ergebnisse werden im Fenster mit allen Gläsern mit dieser Klasse angezeigt. Siehe beigefügtes Bild . enter image description here