web-dev-qa-db-ja.com

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

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

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

227
Kapsh

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

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

54
Andreas_D

Unix

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がシステム内のanywhereであり、 locate コマンドが使用可能な場合:

for i in $(locate "*.jar");
  do echo $i; jar -tvf $i | grep -Hsi ClassName;
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コマンドの出力からパイプされた標準入力を検索します。これは、一致する場合(そうでない場合は0)、ERRORLEVELを1に設定します。
  4. && echo %G-ERRORLEVELがゼロ以外の場合、Javaアーカイブファイル名を標準出力(コンソール)に書き込みます。

Web

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

366
Dave Jarvis

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

57
ipolevoy
grep -l "classname" *.jar

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

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

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

23
user311174
#!/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
11
Pascal Lambert

この問題に遭遇したとき、私はそれを行うユーティリティを知りませんでしたので、私は次のように書きました:

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

}
7
ILMTitan

特定の文字列に一致するjarを見つけるには:

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

7
George Armhold

また、「JarScan」と呼ばれる2つの異なるユーティリティがあります。これらは、求めていることを正確に実行します。 JarScan(inetfeedback.com) および JarScan(Java.net)

5
salzo

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

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

findstr.exeはWindowsとparamsに標準で付属しています。

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

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

3
Ramesh Rooplahl

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

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

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

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に入力できます。

2
Cleonjoys

unzip (zipinfo)を使用したbash scriptソリューション。 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
2
Filippo Lauria

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

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

FindClassInJars utilを使用するだけで、単純なSwingプログラムですが、便利です。 http://code.google.com/p/find-class-in-jars/ でソースコードを確認するか、jarファイルをダウンロードできます。

1
Liubing

JBossの確認 Tattletale ;個人的に使用したことはありませんが、これが必要なツールのようです。

1

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

ls *.jar | xargs grep -F MyClass

または、さらに簡単に、

grep -F MyClass *.jar

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

Binary file foo.jar matches

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

1
Jeff

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

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

1
Ben

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
Joydip Datta

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

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

0
Dipankar Datta

フォルダー(およびサブフォルダー)の一連の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
KrishPrabakar

次のスクリプトが役立ちます

for file in *.jar
do
  # do something on "$file"
  echo "$file"
  /usr/local/jdk/bin/jar -tvf "$file" | grep '$CLASSNAME'
done
0
Kartik Jajal

シェルが少し入った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
Steve B.

お探しのジョブを実行できるEclipse用プラグインを確認してください。

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

0
kutty

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

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

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

0
Victor

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

0
AlainD

これは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
kisp

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

0
Alex

ファイル名:searchForFiles.py

import os, zipfile, glob, sys

def main():
    searchFile = sys.argv[1] #class file to search for, sent from batch file below (optional, see second block of code below)
    listOfFilesInJar = []
    for file in glob.glob("*.jar"):
        archive = zipfile.ZipFile(file, 'r')
        for x in archive.namelist():
            if str(searchFile) in str(x):
                listOfFilesInJar.append(file)

    for something in listOfFilesInJar:
        print("location of "+str(searchFile)+": ",something)

if __== "__main__":
    sys.exit(main())

これを簡単に実行するには、次のテキストを含む.batファイルを作成します(「AddWorkflows.class」を検索するファイルに置き換えます)。

(ファイル:CallSearchForFiles.bat)

@echo off
python -B -c "import searchForFiles;x=searchForFiles.main();" AddWorkflows.class
pause

CallSearchForFiles.batをダブルクリックして実行するか、コマンドライン「CallSearchForFiles.bat SearchFile.class」から呼び出すことができます。

出力例を見るにはクリックしてください

0
Collin Fox

locateおよびgrepを使用できます。

locate jar | xargs grep 'my.class'

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

0
mulugu mahesh

Eclipseでは、古いがまだ使用可能なプラグインを使用できます jarsearch

0
keiki

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

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

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

0
rrevo

これを使用してください。クラスパス内の任意のファイルを見つけることができます。

import Java.net.URL;
import Java.net.URLClassLoader;
import Java.util.Zip.ZipEntry;
import Java.util.Zip.ZipInputStream;

public class FileFinder {

    public static void main(String[] args) throws Exception {

        String file = <your file name>;

        ClassLoader cl = ClassLoader.getSystemClassLoader();

        URL[] urls = ((URLClassLoader)cl).getURLs();

        for(URL url: urls){
            listFiles(file, url);
        }
    }

    private static void listFiles(String file, URL url) throws Exception{
        ZipInputStream Zip = new ZipInputStream(url.openStream());
          while(true) {
            ZipEntry e = Zip.getNextEntry();
            if (e == null)
              break;
            String name = e.getName();
            if (name.endsWith(file)) {
                System.out.println(url.toString() + " -> " + name);
            }
          }
    }

}
0
Apurva Singh

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

JarBrowser を使用して、特定のクラスがどのjarに存在するかを見つけました。使いやすいGUIを使用して、選択したパス内のすべてのjarの内容を参照できます。

0
maccaroo