大量の jar ファイル内で特定のクラス名を見つけるにはどうすればよいでしょうか?
(それを参照するクラスではなく、実際のクラス名を探します。)
大量の jar ファイル内で特定のクラス名を見つけるにはどうすればよいでしょうか?
(それを参照するクラスではなく、実際のクラス名を探します。)
Linux、その他の Unix バリアント、Windows の Git Bash、または Cygwin では、jar
(またはunzip -v
) 、、、grep
およびfind
コマンドを使用します。
以下は、特定の名前に一致するすべてのクラス ファイルの一覧です。
for i in *.jar; do jar -tvf "$i" | grep -Hsi ClassName && echo "$i"; done
検索したい Java アーカイブの全リストがわかっている場合は、(シンボリック) リンクを使用してそれらをすべて同じディレクトリに配置できます。
または、find
(大文字と小文字を区別して) を使用して、特定のクラス名を含む JAR ファイルを見つけます。
find path/to/libs -name '*.jar' -exec grep -Hls ClassName {} \;
たとえば、以下を含むアーカイブの名前を見つけるにはIdentityHashingStrategy
:
$ find . -name '*.jar' -exec grep -Hsli IdentityHashingStrategy {} \;
./trove-3.0.3.jar
JAR がシステム内のどこlocate
にでもある可能性があり、コマンドが使用可能な場合:
for i in $(locate "*.jar");
do echo "$i"; jar -tvf "$i" | grep -Hsi ClassName;
done
構文のバリエーション:
find path/to/libs -name '*.jar' -print | \
while read i; do jar -tvf "$i" | grep -Hsi ClassName && echo "$i"; done
コマンド プロンプトを開き、JAR ファイルを含むディレクトリ (または祖先ディレクトリ) に移動してから、次のようにします。
for /R %G in (*.jar) do @jar -tvf "%G" | find "ClassName" > NUL && echo %G
仕組みは次のとおりです。
for /R %G in (*.jar) do
- すべての JAR ファイルをループし、ディレクトリを再帰的にトラバースします。にファイル名を格納します%G
。@jar -tvf "%G" |
- Java Archive コマンドを実行して、指定されたアーカイブ内のすべてのファイル名を一覧表示し、結果を標準出力に書き込みます。シンボルは@
、コマンドの呼び出しの出力を抑制します。find "ClassName" > NUL
- 指定されたクラス名について、jar コマンドの出力からパイプされた標準入力を検索します。これはERRORLEVEL
、一致する場合は 1 に設定されます (そうでない場合は 0)。&& echo %G
- iffERRORLEVEL
がゼロでない場合、Java アーカイブ ファイル名を標準出力 (コンソール) に書き込みます。(一時的な) プロジェクトを作成し、ライブラリをプロジェクトのクラスパスに配置するだけです。その後、クラスを簡単に見つけることができます。
私の頭に浮かぶもう 1 つのツールは、Java Decompiler です。一度に多くの jar を開くことができ、クラスを見つけるのにも役立ちます。
少し前に、私はそのためだけにプログラムを書きました: https://github.com/javalite/jar-explorer
grep -l "classname" *.jar
瓶の名前を教えてくれます
find . -name "*.jar" -exec jar -t -f {} \; | grep "classname"
クラスのパッケージを提供します
#!/bin/bash
pattern=$1
shift
for jar in $(find $* -type f -name "*.jar")
do
match=`jar -tvf $jar | grep $pattern`
if [ ! -z "$match" ]
then
echo "Found in: $jar"
echo "$match"
fi
done
特定の文字列に一致する jar を見つけるには、次のようにします。
find . -name \*.jar -exec grep -l YOUR_CLASSNAME {} \;
この問題に遭遇したとき、それを行うためのユーティリティを知らなかったので、次のように書きました。
public class Main {
/**
*
*/
private static String CLASS_FILE_TO_FIND =
"class.to.find.Here";
private static List<String> foundIn = new LinkedList<String>();
/**
* @param args the first argument is the path of the file to search in. The second may be the
* class file to find.
*/
public static void main(String[] args) {
if (!CLASS_FILE_TO_FIND.endsWith(".class")) {
CLASS_FILE_TO_FIND = CLASS_FILE_TO_FIND.replace('.', '/') + ".class";
}
File start = new File(args[0]);
if (args.length > 1) {
CLASS_FILE_TO_FIND = args[1];
}
search(start);
System.out.println("------RESULTS------");
for (String s : foundIn) {
System.out.println(s);
}
}
private static void search(File start) {
try {
final FileFilter filter = new FileFilter() {
public boolean accept(File pathname) {
return pathname.getName().endsWith(".jar") || pathname.isDirectory();
}
};
for (File f : start.listFiles(filter)) {
if (f.isDirectory()) {
search(f);
} else {
searchJar(f);
}
}
} catch (Exception e) {
System.err.println("Error at: " + start.getPath() + " " + e.getMessage());
}
}
private static void searchJar(File f) {
try {
System.out.println("Searching: " + f.getPath());
JarFile jar = new JarFile(f);
ZipEntry e = jar.getEntry(CLASS_FILE_TO_FIND);
if (e == null) {
e = jar.getJarEntry(CLASS_FILE_TO_FIND);
if (e != null) {
foundIn.add(f.getPath());
}
} else {
foundIn.add(f.getPath());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ClassFinder は、この問題を解決するために設計されたプログラムです。ディレクトリとjarファイルを再帰的に検索して、パターンに一致するクラスのすべてのインスタンスを見つけることができます。Python ではなく Java で書かれています。それはそれを使いやすくする素晴らしいGUIを持っています。そして、それは速く走ります。このリリースは実行可能な jar にプリコンパイルされているため、ソースからビルドする必要はありません。
ここからダウンロードしてください: ClassFinder 1.0
私は常にこれを Windows で使用してきましたが、非常にうまく機能しました。
findstr /s /m /c:"package/classname" *.jar, where
findstr.exe は、Windows と次のパラメーターに標準で付属しています。
これが誰かに役立つことを願っています。
user1207523 のスクリプトは問題なく動作します。これは、単純な展開の代わりに find を使用して再帰的に jar ファイルを検索するバリアントです。
#!/bin/bash
for i in `find . -name '*.jar'`; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done
パーティーには少し遅れましたが、それでも...
JarBrowserを使用して、特定のクラスが存在する jar ファイルを見つけました。使いやすい GUI を備えており、選択したパスにあるすべての jar の内容を参照できます。
さらに別のツールを追加するには... これは Windows 用の非常にシンプルで便利なツールです。クリックする単純なexeファイルに、検索するディレクトリとクラス名を指定すると、そのクラスを含むjarファイルが見つかります。はい、再帰的です。
FindClassInJars ユーティリティを使用するだけです。これはシンプルなスイング プログラムですが、便利です。http://code.google.com/p/find-class-in-jars/でソース コードを確認したり、jar ファイルをダウンロードしたりできます。
特定のクラスの特定のディレクトリ内のすべての jar ファイルを検索するには、次のようにします。
ls *.jar | xargs grep -F MyClass
または、さらに単純に、
grep -F MyClass *.jar
出力は次のようになります。
Binary file foo.jar matches
-F オプションは固定文字列の検索を意味するため、非常に高速です。そのため、grep 呼び出しごとに正規表現エンジンをロードしません。必要に応じて、いつでも -F オプションを省略して正規表現を使用できます。
jar ファイルを検索するスクリプト: find_jar.sh
IFS=$(echo -en "\n\b") # Set the field separator newline
for f in `find ${1} -iname *.jar`; do
jar -tf ${f}| grep --color $2
if [ $? == 0 ]; then
echo -n "Match found: "
echo -e "${f}\n"
fi
done
unset IFS
使用法: ./find_jar.sh < jar ファイルを含む最上位ディレクトリ > < 検索するクラス名 >
これは、ここで提供されるほとんどの回答に似ています。ただし、grep で何かが見つかった場合は、ファイル名のみが出力されます。grep の出力を抑制したい場合は、それを /dev/null にリダイレクトできますが、部分的なクラス名を使用して、表示された出力のリストから正しい名前を見つけられるように、grep の出力も確認することをお勧めします。
クラス名は、「String」のような単純なクラス名でも、「java.lang.String」のような完全修飾名でもかまいません。
JBoss Tattletaleを確認してください。個人的に使ったことはありませんが、これは必要なツールのようです。
ここのスクリプトが実際に機能しなかった理由がわかりません。これは機能します:
#!/bin/bash
for i in *.jar; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done
恥知らずな自己宣伝ですが、私が書いたユーティリティを試すことができます:http ://sourceforge.net/projects/zfind
最も一般的なアーカイブ/圧縮ファイル(jar、zip、tar、tar.gzなど)をサポートし、他の多くのjar / zipファインダーとは異なり、ネストされたzipファイル(zip内のzip、jar内のjarなど)を無制限の深さまでサポートします。
上記のすべてに追加する1つのこと:jar実行可能ファイルが利用できない場合(JDKには付属していますがJREには付属していません)、unzip(またはWinZipなど)を使用して同じことを実行できます。
Linux 環境では、次のことができます。
$ find <base_dir> -name *.jar -print0 | xargs -0 -l jar tf | grep <name>
nameは、 base_dir をルートとするディレクトリの階層全体に分散された jar 内で見ているクラス ファイルの名前です。
シェルが少し入ったjarファイルでいっぱいのディレクトリでクラスを見つけることができます:
クラス「FooBar」を探しています:
LIB_DIR=/some/dir/full/of/jarfiles
for jarfile in $(find $LIBDIR -name "*.jar"); do
echo "--------$jarfile---------------"
jar -tvf $jarfile | grep FooBar
done
あなたが探している仕事をすることができるEclipse用のこのプラグインをチェックしてください。
これはMinGW(Windows bash環境)でうまく機能します〜gitbash
この関数を HOME ディレクトリの .bashrc ファイルに追加します。
# this function helps you to find a jar file for the class
function find_jar_of_class() {
OLD_IFS=$IFS
IFS=$'\n'
jars=( $( find -type f -name "*.jar" ) )
for i in ${jars[*]} ; do
if [ ! -z "$(jar -tvf "$i" | grep -Hsi $1)" ] ; then
echo "$i"
fi
done
IFS=$OLD_IFS
}
クラスのインスタンスがある場合、またはインスタンスを取得できる場合は、純粋な Java ソリューションがあります。
try{
Class clazz = Class.forName(" try{
Class clazz = Class.forName("class-name");
String name = "/"+clazz.getName().replace('.', '/')+".class";
URL url = clazz.getResource(name);
String jar = url.toString().substring(10).replaceAll("!.*", "");
System.out.println( jar );
}catch(Exception err){
err.printStackTrace();
}
もちろん、最初の 2 行は、クラスのインスタンスまたはクラス名がどこにあるかに応じて変更する必要があります。