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.
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.
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()));
}
}
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...
}
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);
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
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 .class
es 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 class
es anzuzeigen,
jar tvf launcher/target/usergrid-launcher-1.0-SNAPSHOT.jar | grep .class | wc -l
61079
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.
Du kannst den ... benutzen
jar tf example.jar
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 (^).
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
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
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 :
Erstellen Sie ein Eclipse-Java-Beispielprojekt.
Alle Gläser, die Sie in Ihrem Build-Pfad 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 beigefügtes Bild .