web-dev-qa-db-ja.com

jarファイル内のクラスの名前を取得する方法は?

JARファイルがあり、このJARファイル内のすべてのクラスの名前を取得する必要があります。どうやってやるの?

私はそれをグーグルで調べて、JarFileまたはJava ClassLoaderについて何かを見ましたが、どうすればいいかわかりません。

95
sticksu

残念ながら、Javaは「ネイティブ」JREのクラスをリストする簡単な方法を提供しません。 (a)任意のJARファイルについて、そのJARファイル内のエントリを一覧表示し、.classファイルを見つけて、それぞれのJavaクラスを決定できます。 .classファイルは次を表します。または(b)これを行うライブラリを使用できます。

オプション(a):JARファイルを手動でスキャンする

このオプションでは、/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()));
    }
}

オプション(b):特殊なリフレクションライブラリの使用

グアバ

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);
62
sigpwned

Java jarツールを使用できます。 jarファイルの内容をtxtファイルにリストすると、jar内のすべてのクラスを見ることができます。

jar tvf jarfile.jar

-tアーカイブの目次をリストします

-v標準出力に詳細な出力を生成します

-fアーカイブファイル名を指定します

159
Sanjeev Gupta

おそらく、ターミナルのクラスのリストを取得するための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して.classesのみを表示します

$ 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

classesの数を確認するには、

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

これは私が使用しているハックです:

次のようにJavaのオートコンプリートを使用できます。

Java -cp path_to.jar <Tab>

これにより、開始クラスとして渡すことができるクラスのリストが表示されます。もちろん、メインファイルがないものを使用しようとしても何もしませんが、Java.jar内のクラスがどのように呼び出されると考えるかを見ることができます。

9
stanm

使用できます

jar tf example.jar
7
Achyuth

あなたが試すことができます:

jar tvf jarfile.jar 

これは、jarが実行可能な場合、つまり、マニフェストでいくつかのクラスをメインクラスとして定義した場合にのみ役立ちます

5
Pallav

以下のコマンドは、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オプションが指定された場合、ファイル名は小文字に変換され、キャレット(^)のプレフィックスが付きます。

5
Amit Khandelwal

これを試すことができます:

unzip -v /your/jar.jar

これは、jarが実行可能な場合、つまり、マニフェストでいくつかのクラスをメインクラスとして定義した場合にのみ役立ちます

2
Abhimanyu Dutta

ソリューションの説明:Eclipse IDEは、サンプルJavaプロジェクトを作成し、プロジェクトビルドパスにすべてのjarを追加することで使用できます

以下のステップ

  1. サンプルEclipse Javaプロジェクトを作成します。

  2. ビルドパスにあるすべてのjarファイル

  3. Ctrl + Shift + Tキーを押して、完全なクラス名を入力します。

  4. 結果は、そのクラスを持つすべてのjarとともにウィンドウに表示されます。添付の写真をご覧ください。 enter image description here