JARファイルがあり、このJARファイル内のすべてのクラスの名前を取得する必要があります。どうやってやるの?
私はそれをグーグルで調べて、JarFileまたはJava ClassLoader
について何かを見ましたが、どうすればいいかわかりません。
残念ながら、Javaは「ネイティブ」JREのクラスをリストする簡単な方法を提供しません。 (a)任意のJARファイルについて、そのJARファイル内のエントリを一覧表示し、.class
ファイルを見つけて、それぞれのJavaクラスを決定できます。 .class
ファイルは次を表します。または(b)これを行うライブラリを使用できます。
このオプションでは、/path/to/jar/file.jar
のjarファイル内に含まれるすべてのJavaクラスのリストをclassNames
に入力します。
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 には ClassPath
があります。少なくとも14.0以来、これを使用し、気に入っています。 ClassPath
の良い点の1つは、見つかったクラスをロードしないことです。これは、多数のクラスをスキャンするときに重要です。
ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());
for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")) {
// Do stuff with classes here...
}
私は個人的に Reflectionsライブラリ を使用していませんが、好まれているようです。 anyJARファイルによって提供されるパッケージ内のすべてのクラスをロードするこの簡単な方法など、いくつかの優れた例がWebサイトで提供されています。あなたの申請。
Reflections reflections = new Reflections("my.project.prefix");
Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);
Java jar
ツールを使用できます。 jarファイルの内容をtxtファイルにリストすると、jar内のすべてのクラスを見ることができます。
jar tvf jarfile.jar
-tアーカイブの目次をリストします
-v標準出力に詳細な出力を生成します
-fアーカイブファイル名を指定します
おそらく、ターミナルのクラスのリストを取得するためのjar
コマンドを探しています。
$ 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
どこ、
-t list table of contents for archive
-f specify archive file name
または、結果の上にgrepして.class
esのみを表示します
$ 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
class
esの数を確認するには、
jar tvf launcher/target/usergrid-launcher-1.0-SNAPSHOT.jar | grep .class | wc -l
61079
これは私が使用しているハックです:
次のようにJava
のオートコンプリートを使用できます。
Java -cp path_to.jar <Tab>
これにより、開始クラスとして渡すことができるクラスのリストが表示されます。もちろん、メインファイルがないものを使用しようとしても何もしませんが、Java
が.jar
内のクラスがどのように呼び出されると考えるかを見ることができます。
使用できます
jar tf example.jar
あなたが試すことができます:
jar tvf jarfile.jar
これは、jarが実行可能な場合、つまり、マニフェストでいくつかのクラスをメインクラスとして定義した場合にのみ役立ちます
以下のコマンドは、jarファイルの内容をリストします。
コマンド:-unzip -l jarfilename.jar
。
サンプル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
unzip
のマニュアルによる
-lアーカイブファイルをリストします(短い形式)。指定されたファイルの名前、非圧縮ファイルのサイズ、および変更日時が、指定されたすべてのファイルの合計とともに印刷されます。 UnZipがOS2_EASが定義された状態でコンパイルされた場合、-lオプションは、格納されたOS/2拡張属性(EA)およびOS/2アクセス制御リスト(ACL)のサイズの列もリストします。さらに、zipfileコメントと個々のファイルコメント(ある場合)が表示されます。ファイルが単一ケースのファイルシステム(たとえば、古いMS-DOS FATファイルシステム)からアーカイブされ、-Lオプションが指定された場合、ファイル名は小文字に変換され、キャレット(^)のプレフィックスが付きます。
これを試すことができます:
unzip -v /your/jar.jar
これは、jarが実行可能な場合、つまり、マニフェストでいくつかのクラスをメインクラスとして定義した場合にのみ役立ちます
ソリューションの説明:Eclipse IDEは、サンプルJavaプロジェクトを作成し、プロジェクトビルドパスにすべてのjarを追加することで使用できます
以下のステップ:
サンプルEclipse Javaプロジェクトを作成します。
ビルドパスにあるすべてのjarファイル
Ctrl + Shift + Tキーを押して、完全なクラス名を入力します。
結果は、そのクラスを持つすべてのjarとともにウィンドウに表示されます。添付の写真をご覧ください。