各jarファイルの場所を指定せずに、多くのjarファイルの中から特定のクラスファイルを検索したいと思います。
これは簡単なコマンドで可能ですか?
私はこのコマンドを試しました:
grep Hello.class *.jar
これは、クラスを含むjarのリストを返しませんでした。次に、コマンドを実行しました。
grep Hello.class /full/path/of/jar/file/*.jar
これは、関連するjarファイルを返しました。もっと良い方法はありますか?
jarファイルはどこにありますか?それらがどこにあるかを見つけるためのパターンはありますか?
たとえば、foo/a/a.jar
およびfoo/b/b.jar
はすべてフォルダの下にありますfoo/
。この場合、次のコマンドで使用できfind
ますgrep
。
find foo/ -name "*.jar" | xargs grep Hello.class
確かに、少なくともルートディレクトリの下でそれらを検索することはできますが、/
遅くなります。
@loganaayaheeが言ったように、コマンドを使用することもできますlocate
。locate
インデックスを使用してファイルを検索すると、高速になります。ただし、コマンドは次のようになります。
locate "*.jar" | xargs grep Hello.class
jarファイルの内容を検索したいので。
通常、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
ほとんどのソリューションは、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 {}'
jarファイルが含まれているディレクトリに移動し、以下のコマンドを挿入するだけです。
find *.jar | xargs grep className.class
お役に立てれば!
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
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を探します。これが必要なクラスです。
この小さなスニペットを使用しました。遅くなる可能性がありますが、毎回動作します。
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
deepgrepとdeepfindを使用します。Debianベースのシステムでは、次の方法でインストールできます。
sudo apt-get install strigi-utils
どちらのコマンドも、ネストされたアーカイブを検索します。あなたの場合、コマンドは次のようになります。
find . -name "*.jar" | xargs -I {} deepfind {} | grep Hello.class
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