Verwenden Sie eine IDE, da diese automatisch angezeigt wird, wenn Sie eine verwenden.
Joey Rohan
Ich verwende Eclipse, muss dies jedoch mit Code tun.
Sticksu
@LuiggiMendoza - Das potenzielle Duplikat enthält Antworten mit Beispielen sowie Ressourcen für die Dokumentation. Wenn Sie nach einem dieser Klassennamen + Beispiel suchen, erhalten Sie mehrere nützliche Ergebnisse.
Aiias
@Alias das mögliche Duplikat gibt an, wie eine Datei aus einem JAR gefunden und abgerufen werden kann, während die Frage darin besteht, die Klassennamen in einem JAR abzurufen (möglicherweise die Klassen in allen darin enthaltenen Paketen). Der Link in ErikKajus Antwort weist auf eine mögliche Lösung mit JarInputStreamund JarEntryKlassen hin, die ich in keiner Antwort auf Ihren verwiesenen Link finden kann.
Luiggi Mendoza
Antworten:
68
Leider bietet Java keine einfache Möglichkeit, Klassen in der "nativen" JRE aufzulisten. Damit haben Sie einige Möglichkeiten: (a) Für jede gegebene JAR-Datei können Sie die Einträge in dieser JAR-Datei auflisten, die .classDateien suchen und dann bestimmen, welche Java-Klasse jede .classDatei 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 classNamesdie Liste aller Java-Klassen aus, die in einer JAR-Datei unter enthalten sind /path/to/jar/file.jar.
List<String> classNames =newArrayList<String>();ZipInputStream zip =newZipInputStream(newFileInputStream("/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()));}}
Guave hat ClassPathseit mindestens 14.0, die ich benutzt und gemocht habe. Das Schöne daran ClassPathist, dass die gefundenen Klassen nicht geladen werden. Dies ist wichtig, wenn Sie nach einer großen Anzahl von Klassen suchen.
ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")){// Do stuff with classes here...}
Reflexionen
Ich habe die Reflections-Bibliothek nicht persönlich benutzt , aber sie scheint sehr beliebt zu sein. Auf der Website finden Sie einige gute Beispiele wie diese schnelle Möglichkeit, alle Klassen in ein Paket zu laden, das von einer JAR-Datei bereitgestellt wird. Dies kann auch für Ihre Anwendung nützlich sein.
Vielen Dank. Dies beantwortet den Teil "Nur eine Klassenliste erhalten" des OP, der nicht gefragt wurde.
Octopusgrabbus
9
Sie können auch zur Not verwenden unzip -l jarfile.jar. Eine JAR-Datei ist nur eine Zip-Datei mit einem Manifest!
Sigpwned
3
Das Problem ist, dass er wahrscheinlich die Klassendateien zur Laufzeit in einem JAR abrufen wollte, wenn eine Classloader-Instanz vorliegt (wahrscheinlich, um zu sehen, welche Klassen in diesem bestimmten JAR geladen werden).
Richard Duerr
19
Vielleicht suchen Sie nach einem jarBefehl, um die Liste der Klassen im Terminal abzurufen.
Dies war genau das, was ich brauchte, auch wenn der Fragenbesitzer eine codebasierte Lösung benötigte. Vielen Dank!
Providencemac
10
Dies ist ein Hack, den ich benutze:
Sie können die javaautomatische Vervollständigung folgendermaßen verwenden:
java -cp path_to.jar <Tab>
Dadurch erhalten Sie eine Liste der Klassen, die als Startklasse übergeben werden können. Der Versuch, eine zu verwenden, die keine Hauptdatei enthält, führt natürlich zu nichts, aber Sie können sehen, wie javadie Klassen in der Klasse .jarheißen.
Fügen Sie Ihrer Antwort ein bestimmtes Beispiel für ein Beispielglas hinzu.
Juru
4
Der folgende Befehl listet den Inhalt einer JAR- 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 (Kurzformat). Die Namen, unkomprimierten Dateigrößen sowie Änderungsdaten und -zeiten der angegebenen Dateien werden zusammen mit den Summen für alle angegebenen Dateien gedruckt. Wenn UnZip mit definiertem OS2_EAS kompiliert wurde, listet die Option -l auch Spalten für die Größe der gespeicherten erweiterten OS / 2-Attribute (EAs) und OS / 2-Zugriffssteuerungslisten (ACLs) auf. Außerdem werden der Zipfile-Kommentar und einzelne Dateikommentare (falls vorhanden) angezeigt. Wenn eine Datei aus einem Einzelfall-Dateisystem (z. B. dem alten MS-DOS-FAT-Dateisystem) archiviert wurde und die Option -L angegeben wurde, wird der Dateiname in Kleinbuchstaben konvertiert und mit einem Caret (^) versehen.
Während dieser Code - Schnipsel zu begrüßen ist, und etwas Hilfe bieten kann, würde es erheblich verbessert , wenn es eine Erklärung enthalten von , wie und warum Dies löst das Problem. Denken Sie daran, dass Sie in Zukunft die Frage für die Leser beantworten, nicht nur für die Person, die jetzt fragt! Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, und geben Sie an, welche Einschränkungen und Annahmen gelten.
Toby Speight
2
Sie können dies versuchen:
unzip -v /your/jar.jar
Dies ist nur hilfreich, wenn Ihr JAR ausführbar ist, dh im Manifest haben Sie eine Klasse als Hauptklasse definiert
Beschreibung der Lösung : Eclipse IDE kann hierfür verwendet werden, indem ein Beispiel-Java-Projekt erstellt und alle Jars im Projekterstellungspfad hinzugefügt werden
SCHRITTE unten :
Erstellen Sie ein Beispiel für ein Eclipse-Java-Projekt.
Alle Gläser, die Sie in seinem Erstellungspfad haben
STRG + UMSCHALT + T und Geben Sie den vollständigen Klassennamen ein.
Die Ergebnisse werden im Fenster mit allen Gläsern mit dieser Klasse angezeigt. Siehe beigelegtes Foto .
JarInputStream
undJarEntry
Klassen hin, die ich in keiner Antwort auf Ihren verwiesenen Link finden kann.Antworten:
Leider bietet Java keine einfache Möglichkeit, Klassen in der "nativen" JRE aufzulisten. Damit haben Sie einige Möglichkeiten: (a) Für jede gegebene JAR-Datei können Sie die Einträge in dieser JAR-Datei auflisten, die
.class
Dateien suchen und dann bestimmen, 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
die Liste aller Java-Klassen aus, die in einer JAR-Datei unter enthalten sind/path/to/jar/file.jar
.Option (b): Verwendung spezialisierter Reflexionsbibliotheken
Guave
Guave hat
ClassPath
seit mindestens 14.0, die ich benutzt und gemocht habe. Das Schöne daranClassPath
ist, dass die gefundenen Klassen nicht geladen werden. Dies ist wichtig, wenn Sie nach einer großen Anzahl von Klassen suchen.Reflexionen
Ich habe die Reflections-Bibliothek nicht persönlich benutzt , aber sie scheint sehr beliebt zu sein. Auf der Website finden Sie einige gute Beispiele wie diese schnelle Möglichkeit, alle Klassen in ein Paket zu laden, das von einer JAR-Datei bereitgestellt wird. Dies kann auch für Ihre Anwendung nützlich sein.
quelle
Sie können das Java-
jar
Tool verwenden. Listen Sie den Inhalt der JAR-Datei in einer TXT-Datei auf, und Sie können alle Klassen im JAR sehen.quelle
unzip -l jarfile.jar
. Eine JAR-Datei ist nur eine Zip-Datei mit einem Manifest!Vielleicht suchen Sie nach einem
jar
Befehl, um die Liste der Klassen im Terminal abzurufen.wo,
Oder grep einfach über das Ergebnis, um
.class
es nur zu sehenUm die Anzahl der
class
es zu sehen,quelle
Dies ist ein Hack, den ich benutze:
Sie können die
java
automatische Vervollständigung folgendermaßen verwenden:Dadurch erhalten Sie eine Liste der Klassen, die als Startklasse übergeben werden können. Der Versuch, eine zu verwenden, die keine Hauptdatei enthält, führt natürlich zu nichts, aber Sie können sehen, wie
java
die Klassen in der Klasse.jar
heißen.quelle
Du kannst den ... benutzen
quelle
Du kannst es versuchen:
Dies ist nur hilfreich, wenn Ihr JAR ausführbar ist, dh im Manifest haben Sie eine Klasse als Hauptklasse definiert
quelle
Der folgende Befehl listet den Inhalt einer JAR- 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
quelle
Sie können dies versuchen:
Dies ist nur hilfreich, wenn Ihr JAR ausführbar ist, dh im Manifest haben Sie eine Klasse als Hauptklasse definiert
quelle
Verwenden Sie dieses Bash-Skript:
Dadurch werden die Klassen in Gläsern in Ihrem Verzeichnis in der folgenden Form aufgelistet:
Beispielausgabe:
In Windows können Sie Powershell verwenden:
quelle
Beschreibung der Lösung : Eclipse IDE kann hierfür verwendet werden, indem ein Beispiel-Java-Projekt erstellt und alle Jars im Projekterstellungspfad hinzugefügt werden
SCHRITTE unten :
Erstellen Sie ein Beispiel für ein Eclipse-Java-Projekt.
Alle Gläser, die Sie in seinem Erstellungspfad haben
STRG + UMSCHALT + T und Geben Sie den vollständigen Klassennamen ein.
Die Ergebnisse werden im Fenster mit allen Gläsern mit dieser Klasse angezeigt. Siehe beigelegtes Foto .
quelle
windows cmd: Dies würde funktionieren, wenn Sie alle te jars im selben Verzeichnis haben und den folgenden Befehl ausführen
quelle
Mac OS: Am Terminal:
quelle