数十のJARファイル内のどこかにクラスを見つけますか?


249

多くのjarファイル内で特定のクラス名をどのように見つけますか?

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


1
これらの答えについては知りませんが、多数のJARファイルを含む作業中のプロジェクトでクラスが使用されている場合、クラス名にカーソルを合わせて右クリックし、[宣言を開く]をクリックするとうまくいきます( F3); 次に、新しいタブの上部にJARファイルがリストされます。
Andrew

回答:


59

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

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


22
Ctrl + Shift + Tの助けを借りて
KrishPrabakar

408

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-iff ERRORLEVELがゼロ以外の場合、Javaアーカイブファイル名を標準出力(コンソール)に書き込みます。

ウェブ

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


3
はい。
George Armhold

60

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


4
クラスだけでなく、あらゆるタイプのファイルを検索します。ダブルクリックしてファイルの内容を表示します。はい、これですべての春のスキーマを見つけることができます。
Chris Noe

驚くばかり。ありがとう;)
LppEdd 2018年

27
grep -l "classname" *.jar

あなたに瓶の名前を与えます

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

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


5
それはgrep -lir "classname" * .jarである必要があります
Leonard

12
#!/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がない(つまり、パスにない)システムで使用する必要があったため、に置き換えjar -tvfましたunzip -l
ixe013 2013


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

}


4

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

#!/bin/bash
for i in `find . -name '*.jar'`; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done

4

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

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

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

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

これが誰かを助けることを願っています。


3

bash scriptを使用したソリューションunzip (zipinfo)。でテスト済みUbuntu 12

#!/bin/bash

# ./jarwalker.sh "/a/Starting/Path" "aClassName"

IFS=$'\n'
jars=( $( find -P "$1" -type f -name "*.jar" ) )

for jar in ${jars[*]}
    do
        classes=( $( zipinfo -1 ${jar} | awk -F '/' '{print $NF}' | grep .class | awk -F '.' '{print $1}' ) )
        if [ ${#classes[*]} -ge 0 ]; then
            for class in ${classes[*]}
                do
                    if [ ${class} == "$2" ]; then
                        echo "Found in ${jar}"
                    fi
                done
        fi
    done

このスクリプトはmingw互換ではありません
kisp '

2

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

ls *.jar | xargs grep -F MyClass

または、さらに簡単に、

grep -F MyClass *.jar

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

Binary file foo.jar matches

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


2

私はこの新しい方法を見つけました

bash $ ls -1  | xargs -i -t jar -tvf '{}'| grep Abstract
jar -tvf activation-1.1.jar
jar -tvf antisamy-1.4.3.jar
  2263 Thu Jan 13 21:38:10 IST 2011 org/owasp/validator/html/scan/AbstractAntiSamyScanner.class
...

したがって、これはjarとクラスが見つかった場合にリストします。必要に応じて、ls -1 * .jarを指定するか、findコマンドHTH Someoneを使用してxargsに入力できます。


おかげで、私はそれをこのように改善します:ls -1 * .jar | xargs -i -t jar -tvf '{}' | grepの概要
ジェローム・B

2

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

ここからダウンロード:ClassFinder 1.0




1

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

#!/bin/bash
for i in *.jar; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done

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


1

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

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


1

JARのフォルダー(およびサブフォルダー)の束でクラスを見つけるには:https : //jarscan.com/

Usage: java -jar jarscan.jar [-help | /?]
                    [-dir directory name]
                    [-zip]
                    [-showProgress]
                    <-files | -class | -package>
                    <search string 1> [search string 2]
                    [search string n]

Help:
  -help or /?           Displays this message.

  -dir                  The directory to start searching
                        from default is "."

  -zip                  Also search Zip files

  -showProgress         Show a running count of files read in

  -files or -class      Search for a file or Java class
                        contained in some library.
                        i.e. HttpServlet

  -package              Search for a Java package
                        contained in some library.
                        i.e. javax.servlet.http

  search string         The file or package to
                        search for.
                        i.e. see examples above

例:

java -jar jarscan.jar -dir C:\Folder\To\Search -showProgress -class GenericServlet

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

0

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


0

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

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


0

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

私はJarBrowserを使用して、特定のクラスがどのjarに存在するかを見つけてきました。使いやすいGUIを備えているため、選択したパスにあるすべてのjarのコンテンツを参照できます。



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
}

0

Grepjは、jarファイル内のクラスを検索するコマンドラインユーティリティです。私はユーティリティの作成者です。

次のようにユーティリティを実行できます grepj package.Class my1.jar my2.war my3.ear

複数のjar、ear、warファイルを提供できます。高度な使用法については、findを使用して、検索するjarのリストを提供します。



0

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

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

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


0

あなたは使用することができますlocategrep

locate jar | xargs grep 'my.class'

updatedb使用する前に必ず実行してくださいlocate

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.