277

大量の jar ファイル内で特定のクラス名を見つけるにはどうすればよいでしょうか?

(それを参照するクラスではなく、実際のクラス名を探します。)

4

35 に答える 35

474

Unix

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

仕組みは次のとおりです。

  1. for /R %G in (*.jar) do- すべての JAR ファイルをループし、ディレクトリを再帰的にトラバースします。にファイル名を格納します%G
  2. @jar -tvf "%G" |- Java Archive コマンドを実行して、指定されたアーカイブ内のすべてのファイル名を一覧表示し、結果を標準出力に書き込みます。シンボルは@、コマンドの呼び出しの出力を抑制します。
  3. find "ClassName" > NUL- 指定されたクラス名について、jar コマンドの出力からパイプされた標準入力を検索します。これはERRORLEVEL、一致する場合は 1 に設定されます (そうでない場合は 0)。
  4. && echo %G- iffERRORLEVELがゼロでない場合、Java アーカイブ ファイル名を標準出力 (コンソール) に書き込みます。

ウェブ

JAR ファイルをスキャンする検索エンジンを使用します。

于 2009-08-27T18:39:57.590 に答える
68

(一時的な) プロジェクトを作成し、ライブラリをプロジェクトのクラスパスに配置するだけです。その後、クラスを簡単に見つけることができます。

私の頭に浮かぶもう 1 つのツールは、Java Decompiler です。一度に多くの jar を開くことができ、クラスを見つけるのにも役立ちます。

于 2009-08-27T18:32:00.057 に答える
62

少し前に、私はそのためだけにプログラムを書きました: https://github.com/javalite/jar-explorer

于 2011-07-01T03:19:52.300 に答える
33
grep -l "classname" *.jar

瓶の名前を教えてくれます

find . -name "*.jar" -exec jar -t -f {} \; | grep  "classname"

クラスのパッケージを提供します

于 2011-03-22T14:43:24.843 に答える
13
#!/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
于 2011-01-07T06:58:46.970 に答える
9

特定の文字列に一致する jar を見つけるには、次のようにします。

find . -name \*.jar -exec grep -l YOUR_CLASSNAME {} \;

于 2012-04-03T01:46:54.670 に答える
8

この問題に遭遇したとき、それを行うためのユーティリティを知らなかったので、次のように書きました。

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();
        }
    }

}
于 2009-08-27T18:34:35.977 に答える
5

ClassFinder は、この問題を解決するために設計されたプログラムです。ディレクトリとjarファイルを再帰的に検索して、パターンに一致するクラスのすべてのインスタンスを見つけることができます。Python ではなく Java で書かれています。それはそれを使いやすくする素晴らしいGUIを持っています。そして、それは速く走ります。このリリースは実行可能な jar にプリコンパイルされているため、ソースからビルドする必要はありません。

ここからダウンロードしてください: ClassFinder 1.0

于 2019-10-10T17:44:41.187 に答える
4

私は常にこれを Windows で使用してきましたが、非常にうまく機能しました。

findstr /s /m /c:"package/classname" *.jar, where

findstr.exe は、Windows と次のパラメーターに標準で付属しています。

  • /s = 再帰的に
  • /m = 一致するファイル名のみを表示
  • /c = リテラル文字列 (この場合、パッケージ名 + '/' で区切られたクラス名)

これが誰かに役立つことを願っています。

于 2016-10-21T14:42:28.850 に答える
4

user1207523 のスクリプトは問題なく動作します。これは、単純な展開の代わりに find を使用して再帰的に jar ファイルを検索するバリアントです。

#!/bin/bash
for i in `find . -name '*.jar'`; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done
于 2013-07-19T11:22:22.507 に答える
2

パーティーには少し遅れましたが、それでも...

JarBrowserを使用して、特定のクラスが存在する jar ファイルを見つけました。使いやすい GUI を備えており、選択したパスにあるすべての jar の内容を参照できます。

于 2013-02-15T00:41:20.600 に答える
2

さらに別のツールを追加するには... これは Windows 用の非常にシンプルで便利なツールです。クリックする単純なexeファイルに、検索するディレクトリとクラス名を指定すると、そのクラスを含むjarファイルが見つかります。はい、再帰的です。

http://sourceforge.net/projects/jarfinder/

于 2013-07-19T11:57:06.367 に答える
2

FindClassInJars ユーティリティを使用するだけです。これはシンプルなスイング プログラムですが、便利です。http://code.google.com/p/find-class-in-jars/でソース コードを確認したり、jar ファイルをダウンロードしたりできます。

于 2011-03-31T13:36:10.813 に答える
2

特定のクラスの特定のディレクトリ内のすべての jar ファイルを検索するには、次のようにします。

ls *.jar | xargs grep -F MyClass

または、さらに単純に、

grep -F MyClass *.jar

出力は次のようになります。

Binary file foo.jar matches

-F オプションは固定文字列の検索を意​​味するため、非常に高速です。そのため、grep 呼び出しごとに正規表現エンジンをロードしません。必要に応じて、いつでも -F オプションを省略して正規表現を使用できます。

于 2013-06-07T16:22:51.600 に答える
1

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」のような完全修飾名でもかまいません。

于 2013-09-17T10:31:55.763 に答える
1

JBoss Tattletaleを確認してください。個人的に使ったことはありませんが、これは必要なツールのようです。

于 2009-08-27T18:42:52.047 に答える
1

ここのスクリプトが実際に機能しなかった理由がわかりません。これは機能します:

#!/bin/bash
for i in *.jar; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done
于 2013-03-04T12:38:30.927 に答える
0

恥知らずな自己宣伝ですが、私が書いたユーティリティを試すことができます:http ://sourceforge.net/projects/zfind

最も一般的なアーカイブ/圧縮ファイル(jar、zip、tar、tar.gzなど)をサポートし、他の多くのjar / zipファインダーとは異なり、ネストされたzipファイル(zip内のzip、jar内のjarなど)を無制限の深さまでサポートします。

于 2012-05-23T11:09:34.440 に答える
0

上記のすべてに追加する1つのこと:jar実行可能ファイルが利用できない場合(JDKには付属していますがJREには付属していません)、unzip(またはWinZipなど)を使用して同じことを実行できます。

于 2009-09-14T16:53:10.220 に答える
0

Linux 環境では、次のことができます。

$ find <base_dir> -name *.jar -print0 | xargs -0 -l jar tf | grep <name>

nameは、 base_dir をルートとするディレクトリの階層全体に分散された jar 内で見ているクラス ファイルの名前です

于 2015-04-17T16:18:43.250 に答える
0

シェルが少し入った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
于 2009-08-27T18:41:21.660 に答える
0

あなたが探している仕事をすることができるEclipse用のこのプラグインをチェックしてください。

https://marketplace.eclipse.org/content/jarchiveexplorer

于 2014-06-06T11:26:14.237 に答える
0

これは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
}
于 2013-08-08T09:48:39.110 に答える
0

クラスのインスタンスがある場合、またはインスタンスを取得できる場合は、純粋な 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 行は、クラスのインスタンスまたはクラス名がどこにあるかに応じて変更する必要があります。

于 2016-11-30T20:17:00.450 に答える