JARファイルがあり、このJARファイル内のすべてのクラスの名前を取得する必要があります。どうやってやるの?
私はそれをググって、JarFileかJavaについて何かを見ましたClassLoader
、しかし、私はそれをする方法がわかりません。
JarInputStream
とJarEntry
クラスを示しています。
JARファイルがあり、このJARファイル内のすべてのクラスの名前を取得する必要があります。どうやってやるの?
私はそれをググって、JarFileかJavaについて何かを見ましたClassLoader
、しかし、私はそれをする方法がわかりません。
JarInputStream
とJarEntry
クラスを示しています。
回答:
残念ながら、Javaは「ネイティブ」JREでクラスをリストする簡単な方法を提供していません。これにはいくつかのオプションがあります。(a)特定のJARファイルについて、そのJARファイル内のエントリをリストし、ファイルを見つけて、.class
各.class
ファイルが表すJavaクラスを決定できます。または(b)これを行うライブラリを使用できます。
このオプションではclassNames
、のjarファイル内に含まれるすべてのJavaクラスのリストを入力します/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()));
}
}
グアバはClassPath
、少なくとも14.0から使用しています。良い点の1つClassPath
は、検出したクラスを読み込まないことです。これは、多数のクラスをスキャンする場合に重要です。
ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());
for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")) {
// Do stuff with classes here...
}
個人的にReflectionsライブラリを使用したことはありませんが、とても気に入っているようです。いくつかの素晴らしい例がが提供するパッケージのすべてのクラスをロードするには、この簡単な方法のようなウェブサイトで提供されているすべてのも、あなたのアプリケーションのために有用である可能性があるJARファイル、。
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アーカイブファイル名を指定
unzip -l jarfile.jar
。JARファイルは、マニフェストを含む単なるzipファイルです。
たぶんあなたは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
または、.class
esのみを表示するには、上記の結果をgrepします
$ 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
あなたが試すことができます:
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オプションが指定された場合、ファイル名は小文字に変換され、先頭にキャレット(^)が付きます。
次のbashスクリプトを使用します。
#!/bin/bash
for VARIABLE in *.jar
do
jar -tf $VARIABLE |grep "\.class"|awk -v arch=$VARIABLE '{print arch ":" $4}'|sed 's/\//./g'|sed 's/\.\.//g'|sed 's/\.class//g'
done
これにより、ディレクトリ内のjar内のクラスが次の形式でリストされます。
file1.jar:fullyqualifiedclassName
file1.jar:fullyqualifiedclassName
file1.jar:fullyqualifiedclassName
file1.jar:fullyqualifiedclassName
file2.jar:fullyqualifiedclassName
file2.jar:fullyqualifiedclassName
file2.jar:fullyqualifiedclassName
出力例:
commons-io.jar:org.apache.commons.io.ByteOrderMark
commons-io.jar:org.apache.commons.io.Charsets
commons-io.jar:org.apache.commons.io.comparator.AbstractFileComparator
commons-io.jar:org.apache.commons.io.comparator.CompositeFileComparator
commons-io.jar:org.apache.commons.io.comparator.DefaultFileComparator
commons-io.jar:org.apache.commons.io.comparator.DirectoryFileComparator
commons-io.jar:org.apache.commons.io.comparator.ExtensionFileComparator
commons-io.jar:org.apache.commons.io.comparator.LastModifiedFileComparator
Windowsではpowershellを使用できます。
Get-ChildItem -File -Filter *.jar |
ForEach-Object{
$filename = $_.Name
Write-Host $filename
$classes = jar -tf $_.Name |Select-String -Pattern '.class' -CaseSensitive -SimpleMatch
ForEach($line in $classes) {
write-host $filename":"(($line -replace "\.class", "") -replace "/", ".")
}
}
ソリューションの説明:サンプルJavaプロジェクトを作成し、プロジェクトビルドパスにすべてのjarを追加することで、Eclipse IDEを使用できます。
以下の手順:
サンプルのEclipse Javaプロジェクトを作成します。
ビルドパスにあるすべてのjar
Ctrl + Shift + Tおよびクラスの完全な名前を入力します。
結果は、そのクラスを持つすべてのjarとともにウィンドウに表示されます。添付画像を参照してください。