web-dev-qa-db-ja.com

クラス名が指定されたjarファイルを見つけますか?

これはJava開発者にとって非常に基本的な質問ですが、適切なものを見つけるための最良の方法は何ですか? jar file 与えられた クラス名

たとえば、「 com.ibm.websphere.security.auth.WSSubject 」とすると、適切なjarファイルをどのように追跡しますか? (「google」は私が探している答えではありません!)

Java docs はjarファイルのヒントを提供しません。また、明らかにjarファイルの名前自体には何の手がかりもありません。

「ローカルjarの検索」または「自動依存関係の自動解決」が必要です。Java world。理想的には、「公式」な方法を探していますこれ。たまたまcygwinのないWindowsマシンにいます。

62
Jeffrey Knight

これをfindclass.sh(または何でも)として保存し、パスに置いて実行可能にします:

#!/bin/sh
find "$1" -name "*.jar" -exec sh -c 'jar -tf {}|grep -H --label {} '$2'' \;

最初のパラメーターは再帰的に検索するディレクトリで、2番目のパラメーターは検索する正規表現(通常は単純なクラス名)です。

$ findclass.sh . WSSubject

このスクリプトは、jarコマンド(内容をリストする)の-tオプションに依存し、各目次を検索し、見つかったJARファイルのパスとの一致にラベルを付けます。

81
Dan Dyer

このプログラムを作成しました: https://github.com/javalite/jar-Explorer また、既存のバイトコードを逆コンパイルしてインターフェイスを表示します、メソッド、スーパークラスは、他のリソースのコンテンツ(テキスト、画像、htmlなど)を表示します。

14
ipolevoy

「公式」Javaこの知る限りの方法はありません。

私が通常それを探す方法は、findおよびjarを使用して、指定されたツリー内のすべてのjarファイルを調べることです。

> find . -name \*.jar -print -exec jar tf {} Oracle/sql/BLOB.class \;
./v2.6.1/lib/csw_library.jar
./v2.6.1/lib/Oracle_drivers_12_01.jar
Oracle/sql/BLOB.class

Windowsを使用していて、Cygwinをインストールしたくない場合、jarファイルを見つけるためにバッチスクリプトを作成する必要があると思います。

13
Dave Costa

現在のディレクトリの下にあるすべてのjarファイルを検索し、クラスa.b.c.Dを含むjarファイルを返すには、次の操作を行います。

find . -iname *.jar | while read JARF; do jar tvf $JARF | grep a/b/c/D.class && echo $JARF ; done

クラスa.b.c.D(または同様の接尾辞を持つクラス)のすべてのインスタンスを報告し、それを含むjarのみを出力します。

典型的な出力:

$ find . -iname *.jar | while read JARF; do jar tvf $JARF | grep Log.class && echo $JARF ; done
479 Fri Oct 10 18:19:40 PDT 2003 org/Apache/commons/logging/Log.class
3714 Fri Oct 10 18:19:40 PDT 2003 org/Apache/commons/logging/impl/Log4JCategoryLog.class
1963 Fri Oct 10 18:19:40 PDT 2003 org/Apache/commons/logging/impl/NoOpLog.class
9065 Fri Oct 10 18:19:40 PDT 2003 org/Apache/commons/logging/impl/SimpleLog.class
./WebContent/WEB-INF/lib/commons-logging.jar

ご使用のシステム(Solarisなど)のgrepにDan Dyerの例で使用されている-Hおよび--labelがない場合は、次を使用できます。

find . -name '*.jar' -type f | xargs -i bash -c "jar -tvf {}| tr / . | grep WSSubject && echo {}"
5
Stephen Muench

次のようなサービスを試すことができます。

または

または

  • 検索機能を備えたMavenエンタープライズリポジトリNexus(OFC、これは、探しているjarがインデックス化されている場合、つまりリポジトリにインストールされている場合にのみ機能します)

PS:JarhooはJavacio.usと提携して、100,000 Java開発者がGoogle検索結果に統合されたリンクを介してJarhooに無料でアクセスできるようにします。Javacio.usのサブスクリプションは無料で、詳細については、Javacio.usの Jarhooオファーページにアクセスしてください

4
Pascal Thivent

Findjar.comを試してください。パブリックドメインにある場合は、取得する必要があります。 alos mavenjava.comがあります(ただし、そのサイトはダウンしているようです)

3
Joseph

Windowsでcmd.exeを実行し、次を入力します。

  for %i in (*.jar) do @jar tvf %i | find "/com/company/MyClass.class"

Jarは現在のディレクトリにある必要があります。 forには、ディレクトリを取得して再帰的に検索できる/ Rオプションもあります。

Jar.exeがパスにない場合は、@ C:\ jdk\bin\jar.exeのようにできます。

3
Yishai

確認しながらリストを表示できるように、リストを印刷します。ほとんどはlib/appディレクトリを探していますが、findの代わりにLocateを使用できます。

例えば.

for jar in $(find some_dir/lib -name "*.jar" ); 
do
echo -------------$jar-------------------
jar -tf $jar | grep TheNameOfTheClassImLookingFor
done
2
Steve B.

また、役に立つと思われる this Webサイトもあります。 http://www.findjar.com/

1
Ron Tuffin

Windows PowerShellでは、このコマンドを使用できます。検出されたすべてのJARファイルをリストしますが、追加の行があり、クラスを見つける場所を簡単に見つけることができます。

Get-ChildItem -recurse -Filter *.jar | Foreach {echo $_.fullname; c:\somepath\JDK\BIN\jar tvf $_.fullname | Select-String -pattern "Cabbages.class"}
1
WoodenKitty

jarscan を使用します。実行可能なjarファイルであり、探しているクラスを含むjarのフォルダー構造全体を再帰的に検索できます。クラス名、パッケージ名、または正規表現で検索します。

1
Mike Pone

依存関係を処理しようとするあなたのコメントを考えると、私はあなたが使用しているライブラリに焦点を合わせます。これを知っていれば、クラスパスにどのjarが含まれている必要があるかがわかり、それに注意を払うことができます。内部に依存関係を持つプロジェクトをパッケージ化できる依存関係管理ビルダー(MavenとAntは2つの人気のあるもの)もあります。ただし、最終的には、どの依存関係があるかを知り、それらの依存関係の要件に注意を払うのは開発者の責任です。これが、EclipseのようにIDEを使用し、MavenやAntのようなビルドツールを使用すると、プロジェクトに20個の依存関係がある場合、管理し難くなる可能性があります。

1
aperkins

.jarを見つける| xargs grep com.ibm.websphere.security.auth.WSSubject

0
Paul Tomblin

Maven、Eclipse、m2Eclipseの使用をお勧めします。

ステップ1-特定のインポートを追加する

alt text

ステップ2-目的のjarを見つけて(自動的に)ダウンロードする

alt text

0
cetnar

ダンの優れた答え に基づいて、次のスクリプトは、いくつかのjarファイルが実際に壊れたシンボリックリンクの場合のマングル出力の問題を解決します(同時に適切なシンボリックリンクをスキップしません)引数が指定されていない場合はディレクトリ。

#!/usr/bin/env bash

if [[ ($# -ne 1) && ($# -ne 2) ]]
then
    echo "usage is $0 <grep RegEx to look for in contents of jar> [<top-of-folder-hierarchy> or, if missing, current dir]"
else
    REG_EXP=$1
    DIR=${2:-.}
    if [ ! -d $DIR ]; then
        echo "directory [$DIR] does not exist";
        exit 1;
    fi
    find "$DIR" -name "*.jar" -exec sh -c '
    (test -e {})
    exitStatus=$?
    if [ "$exitStatus" -eq 0 ]; then # this is done to avoid broken symlinks
        jar -tf {}|grep -i -H --label {} '$REG_EXP'
    fi
' \;
fi

まだWSSubjectを検索している場合、jarはwssec.jarです。 sas.jar内のWSSecurityExceptionクラス

0
Som