53

各jarファイルの場所を指定せずに、多くのjarファイルの中から特定のクラスファイルを検索したいと思います。

これは簡単なコマンドで可能ですか?

私はこのコマンドを試しました:

grep Hello.class *.jar

これは、クラスを含むjarのリストを返しませんでした。次に、コマンドを実行しました。

grep Hello.class /full/path/of/jar/file/*.jar

これは、関連するjarファイルを返しました。もっと良い方法はありますか?

4

8 に答える 8

96

jarファイルはどこにありますか?それらがどこにあるかを見つけるためのパターンはありますか?

1.それらはすべて1つのディレクトリにありますか?

たとえば、foo/a/a.jarおよびfoo/b/b.jarはすべてフォルダの下にありますfoo/。この場合、次のコマンドで使用できfindますgrep

find foo/ -name "*.jar" | xargs grep Hello.class

確かに、少なくともルートディレクトリの下でそれらを検索することはできますが、/遅くなります。

@loganaayaheeが言ったように、コマンドを使用することもできますlocatelocateインデックスを使用してファイルを検索すると、高速になります。ただし、コマンドは次のようになります。

locate "*.jar" | xargs grep Hello.class

jarファイルの内容を検索したいので。

2.パスは環境変数に保存されていますか?

通常、Javaはjarファイルを見つけるためのパスを次のような環境変数に格納しますCLASS_PATH。これが必要かどうかはわかりません。ただし、変数が次のようになっている場合は、パスを区切るCLASS_PATH=/lib:/usr/lib:/binためにaを使用し、:次のコマンドを使用してクラスを検索できます。

for P in `echo $CLASS_PATH | sed 's/:/ /g'`; do grep Hello.calss $P/*.jar; done
于 2013-01-17T08:21:20.367 に答える
39

ほとんどのソリューションは、grepコマンドを直接使用してクラスを検索しています。ただし、クラスのパッケージ名はわかりません。また、jarが圧縮されている場合は、機能しgrepません。

このソリューションでは、jarコマンドを使用して、ファイルの内容とgrep探しているクラスを一覧表示します。

パッケージ名jarファイル名でクラスを出力します。

find . -type f -name '*.jar' -print0 |  xargs -0 -I '{}' sh -c 'jar tf {} | grep Hello.class &&  echo {}'

以下のようにパッケージ名で検索することもできます。

find . -type f -name '*.jar' -print0 |  xargs -0 -I '{}' sh -c 'jar tf {} | grep com/mypackage/Hello.class &&  echo {}'
于 2013-10-09T01:37:56.360 に答える
4

jarファイルが含まれているディレクトリに移動し、以下のコマンドを挿入するだけです。

find *.jar | xargs grep className.class

お役に立てれば!

于 2015-02-12T08:37:12.617 に答える
2
   locate *.jar | grep Hello.class.jar

特定のファイルのすべてのパスを検索し、ファイルの絶対パスを表示するためのlocateコマンド。

locate *.jar | grep classic.jar

/opt/ltsp/i386/usr/share/firefox/chrome/classic.jar

/opt/ltsp/i386/usr/share/thunderbird/chrome/classic.jar

/root/.wine/drive_c/windows/gecko/0.1.0/wine_gecko/chrome/classic.jar

/usr/lib/firefox-3.0.14/chrome/classic.jar

/usr/lib/firefox-3.5.2/chrome/classic.jar

/usr/lib/xulrunner-1.9.1.2/chrome/classic.jar

/usr/share/firefox/chrome/classic.jar

/usr/share/thunderbird/chrome/classic.jar
于 2013-01-17T11:15:07.907 に答える
2

Linux、多くのjarファイルの中からクラスファイルを見つけるためのウォークスルー。

下のjarファイルが含まれているディレクトリに移動します。

eric@dev /home/el/kafka_2.10-0.8.1.1/libs $ ls
blah.txt                             metrics-core-2.2.0.jar
jopt-simple-3.2.jar                  scala-library-2.10.1.jar
kafka_2.10-0.8.1.1-sources.jar       zkclient-0.3.jar
kafka_2.10-0.8.1.1-sources.jar.asc   zookeeper-3.3.4.jar
log4j-1.2.15.jar

Producerクラスにどのjarが提供されるかを探しています。

forループがどのように機能するかを理解します。

eric@dev /home/el/kafka_2.10-0.8.1.1/libs $ for i in `seq 1 3`; do
> echo $i
> done
1
2
3

これが機能する理由を理解します。

eric@dev /home/el/kafka_2.10-0.8.1.1/libs $ find . -name "*.jar"
./slf4j-api-1.7.2.jar
./zookeeper-3.3.4.jar
./kafka_2.10-0.8.1.1-javadoc.jar
./slf4j-1.7.7/osgi-over-slf4j-1.7.7-sources.jar

下にあるすべてのjarファイルをforループにポンプで送ることができます。

eric@dev /home/el/kafka_2.10-0.8.1.1/libs $ for i in `find . -name "*.jar"`; do
> echo $i
> done

./slf4j-api-1.7.2.jar
./zookeeper-3.3.4.jar
./kafka_2.10-0.8.1.1-javadoc.jar
./kafka_2.10-0.8.1.1-sources.jar

これで、それぞれを操作できます。

すべてのjarファイルでajar tfを実行し、blah.txtに詰め込みます。

for i in `find . -name "*.jar"`; do echo $i; jar tf $i; done > blah.txt

blah.txtを調べてください。これは、すべてのjar内のすべてのクラスのリストです。そのファイルで必要なクラスを検索し、その前にあるjarを探します。これが必要なクラスです。

于 2014-08-22T18:39:55.220 に答える
2

この小さなスニペットを使用しました。遅くなる可能性がありますが、毎回動作します。

for i in 'find . -type f -name "*.jar"'; do
    jar tvf $i | grep "com.foo.bar.MyClass.clss";
    if [ $? -eq 0 ]; then echo $i; fi;
done
于 2016-06-06T04:24:34.670 に答える
1

deepgrepとdeepfindを使用します。Debianベースのシステムでは、次の方法でインストールできます。

sudo apt-get install strigi-utils

どちらのコマンドも、ネストされたアーカイブを検索します。あなたの場合、コマンドは次のようになります。

find . -name "*.jar" | xargs -I {} deepfind {} | grep Hello.class
于 2014-06-11T09:48:24.437 に答える
-1
eric@dev /home/el/kafka_2.10-0.8.1.1/libs $ for i in `find . -name "*.jar"`; do
> echo $i
> done

./slf4j-api-1.7.2.jar
./zookeeper-3.3.4.jar
./kafka_2.10-0.8.1.1-javadoc.jar
./kafka_2.10-0.8.1.1-sources.jar
于 2016-05-11T10:04:01.967 に答える