web-dev-qa-db-ja.com

クラス定義を含むjarファイルを見つける方法

たくさんのjarファイルでJavaクラスを見つけるために使用できるツール、プラグイン、またはスクリプトはありますか?

存在しないクラスについて不平を言うコードを継承することがよくあります。それは、jarファイルがクラスパスに含まれていないためです。しかし、クラスはどのjarファイルにありますか? JARがない可能性があるため(オンラインで検索する必要があります)、クラスパスにJARを追加すると、クラス定義の重複問題が発生する可能性があります。

私は明らかにEclipseプラグインを好みますが、私はWindowsで動作するあらゆるソフトウェアに門戸を開いています。

私は知っています... Windowsは私の選択ではありませんが、それが私が仕事をしなければならないものです。

ありがとう!

ルイス

追伸回答ありがとうございます。いくつかの回答を検討した後、自分のシナリオをよりよく説明する必要があることに気付きました。ダウンロードまたは作成されたJARファイルのライブラリがありましたが、クラスがどこかでオンラインになることもありました。

30
luiscolorado

(これは、いくつかのawk特別/醜い引用の価格ではるかにきれいな出力を生成するため、以前のバージョンの回答で使用していたスクリプトよりも優れています。)

それを行うスクリプト(findinjars)を作成しました。

#!/usr/bin/env bash
if [[ ($# -ne 1) && ($# -ne 2) ]]
then
    echo "usage is $0 <grep pattern to look for in 'jar tvf' output> [<top-of-dir-tree> or, if missing, current dir]"
else
    THING_TO_LOOKFOR="$1"
    DIR=${2:-.}
    if [ ! -d $DIR ]; then
        echo "directory [$DIR] does not exist";
        exit 1;
    fi
    find "$DIR" -iname \*.jar | while read f ; do (jar tf $f | awk '{print "'"$f"'" "  " $0}' | grep -i "$THING_TO_LOOKFOR") ; done
fi

その後、次のコマンドで呼び出すことができます。

$findinjars a.b.c.d.Class [directoryTreeRoot or, if missing, current dir]

あるいは単に

$findinjars partOfClassName [directoryTreeRoot or, if missing, current dir]

完全修飾クラス名のドット文字は「任意の文字」という正規表現で解釈されますが、これはヒューリスティックユーティリティであるため、大したことではありません(そのため、大文字と小文字を区別せず、BTWも大文字です)。通常、完全なクラス名を気にせず、その一部を入力します。

36

BalusCの回答と同じ行で(コメントを投稿することも、2つのURLをリンクすることもできず、評判もない:()、これらの2つのjarファインダーエンジンのおかげでjarを見つけることができます:- http:// www。 jarfinder.com/ -findjar

11
Fanny H.

よりシンプルなコマンド。 「while-do」を使用する必要はありません。「grep」がクラスを見つけた場合、「&&」を使用してファイル名を出力します。

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

私は何度も同じ問題に遭遇したので、それらを見つけるための小さなツールを書きました。

簡単なコマンドライン:findclass MyClass -classpath ...

それはあなたのクラスのディレクトリ、jar、Zip、war、earファイルを検索します。数年前に書いて、ずっと使っています。他の人にも役立つと思うので、githubにアップロードしました。

無料でダウンロードできます: https://github.com/eurozulu/Findclass/tree/master/dist

ソースを見たい場合は、同じサイトにあります: https://github.com/eurozulu/Findclass/tree/master

よろしければ、暖かく快適な雰囲気をお伝えください。

6
Rob

私は通常そのためにbashを使います:grep -lr "ClassName" .トリックは、名前がどのようにもエンコードされないことです。テキストエディターでjarファイルを開くと、それらが表示されます。 (検索クエリにパッケージ名を含めることもできます。)

同等のウィンドウもいくつかあると思います。

5
Nikita Rybak

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

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

検索範囲は

  • Jarファイル内のクラス
  • 入れ子のアーティファクト内のクラス(earおよびwarファイル内のjarなど)
  • WEB-INF/classesも検索されます。

複数のjar、ear、warファイルを提供できます。

2
rrevo

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

2
Mike Pone

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

2
ipolevoy

存在しないクラスについて不平を言うコードを継承することがよくあります。それは、jarファイルがクラスパスに含まれていないためです。

クラスパスにない場合は、JARファイル自体がない可能性があります。 Eclipseの組み込みCtrl+Shift+T関数を使用して検索しても、あまり役に立ちません。通常、インターネットでJARファイルを取得できる場所を「推測」するためにパッケージ名を使用できます。例えば。 org.Apache.commons.lang.XXXクラスは http://commons.Apache.org/lang で入手できます。

自明ではないものについては、私自身がJARソースコード検索エンジンである http://grepcode.com を使用しています。

2
BalusC

これを使って:

public class Main {

    private static final String SEARCH_PATH = "C:\\workspace\\RPLaunch";
    private static String CLASS_FILE_TO_FIND =
            "javax.ejb.SessionBean";
    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) {
        File start;
        new Scanner(args[0]);
        if (args.length > 0) {
            start = new File(args[0]);
            if (args.length > 1) {
                CLASS_FILE_TO_FIND = args[1];
            }
        } else {
            start = new File(SEARCH_PATH);
        }
        if (!CLASS_FILE_TO_FIND.endsWith(".class")) {
            CLASS_FILE_TO_FIND = CLASS_FILE_TO_FIND.replace('.', '/') + ".class";
        }
        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());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
1
ILMTitan

最良かつ最も簡単な方法は、JADデコンパイラーを使用することです。そして、はい、Eclipse PLUGIN

ダウンロード プラグインをマシンの任意の場所に保存します。

プラグインには次のファイルが含まれています。

  1. tempフォルダー
  2. jad.exeファイル
  3. * net.sf.jadclipse_3.3.0.jar * JARプラグイン
  4. Readme

次の手順を実行します。

  1. JARプラグインをEclipseフォルダーのpluginsフォルダーにコピーします。
  2. Eclipseを開きます。 Goto Window >> Preferences >> Java >> JADClipse >> Path to Decompiler。
  3. Jad.exeのパスを指定します
  4. Eclipseを再起動します

ここで任意のクラスを選択し、F3を押します。

.classファイルは自動的に逆コンパイルして内容を表示します!

1
Neal

最近、クラス、パッケージ、ライブラリを検索するツールを作成しました。あなたはそれを試すことができます http://javasearch.buggybread.com/ 。フレームワークをクリックすると、依存関係情報(jar、pom)を見つけるのに役立ちます。

1
Vivek Vermani

$(find。-name '* .jar')のxの場合、解凍-l $ x | grep WCCResponseImpl完了

1
user2981289

これらのUnixコマンドをいくつか試しましたが、さまざまな理由でエラーが発生しました。これが私が書いたPerlスクリプトです。 CygwinバージョンのPerlを使用してCygwinで実行するように特別に設計されています。

#!/bin/Perl

# This program searches recursively for a given class in .jar files contained in or below
# directories given as command-line arguments. See subroutine printUsageAndExit for details,
# or just run it with -h command-line argument.
#
# It is specfically designed to run on Windows via Cygwin, with Cygwin's version of Perl,
# though it could easily be modified to run elsewhere.

use strict;
use File::Find;
use Getopt::Std;

sub processCommandLineArguments (\$\@);
sub checkCommandLineArguments;

my $className;
my @startingDirectories;

&checkCommandLineArguments;
&processCommandLineArguments (\$className, \@startingDirectories );

my %options;
$options{wanted} = \&processFoundFile;
$options{no_chdir} = 1;
$options{follow} = 1; # So that $File::Find::fullname will be populated.
$options{follow_skip} = 2; # So it won't die if it encounters the same thing twice.

&find ( \%options, @startingDirectories );  # find comes from "use File::Find".

sub processFoundFile{
    # This routine is called by File::Find.
    #
    #  $File::Find::dir is the current directory name,
    #  $_ is the current filename within that directory
    #  $File::Find::name is the complete pathname to the file.

    my $jarFileName = $_;

    return unless /\.jar$/;

    my $fullFileName = $File::Find::fullname; # set by File::Find only when $options{follow} == 1

    # Windowize filename:
    $fullFileName = qx{cygpath --windows $fullFileName 2>&1};
    chomp $fullFileName;
    $fullFileName = '"' . $fullFileName . '"';

    my @results = qx{jar -tf $fullFileName 2>&1};

    local $/ = "\r\n";  # So that this Unix-based Perl can read output from Windows based jar command.

    for my $result ( @results )
    {
        chomp $result;

        if ( $result =~ /\b(\w+)\.((Java)|(class))$/ )
        {
            my $classNameFound = $1;

            if ($classNameFound eq $className)
            {
                print $jarFileName, "\n";
                return;
            }
        }
    }
}

sub processCommandLineArguments (\$\@){

    my $refClassName = shift;
    my $refStartingDirectories = shift;

    $$refClassName = '';

    # parse @ARGV
    while (@ARGV){
        my $arg = shift @ARGV;

        if ($arg =~ /\Q-c/){
            $$refClassName = shift @ARGV;
        }elsif ($arg =~ /\Q-directories/){

            while ($ARGV[0] =~ m{^/(\w+/?)+\b}){
                my $directory = shift @ARGV;
                die "Can't find $directory $!" if ! -e $directory;
                Push @$refStartingDirectories, $directory;
            }
        }
    }

    die "Must give -c class_name argument $!" if $$refClassName eq "";

    Push @$refStartingDirectories, '.' if scalar (@$refStartingDirectories ) == 0;
}

sub checkCommandLineArguments
{
    {
        # getopts butchers @ARGV, so have to use it on a local version.
        local @ARGV = @ARGV;

        our $opt_h;
        &getopts('hc'); # Have to specify all options given or getopts will die.

        &printUsageAndExit if $opt_h;
    }

    my $className;

    {
        # getopts butchers @ARGV, so have to use it on a local version.
        local @ARGV = @ARGV;

        while (@ARGV){
            my $arg = shift @ARGV;

            if ($arg =~ /\Q-c/){
                $className = shift @ARGV;

                &printUsageAndExit if $className =~ /^\s*$/ ;

                return;
            }
        }
    }

    &printUsageAndExit;
}

sub printUsageAndExit
{
    print "Usage:\n\n";
    print "$0 -c class_name_to_search_for [ -directories startingDirectory1 startingDirectory2 ...]\n\n";
    print "Example:\n\n";
    print "findJarContainingClass.pl -c ApplicationMaster -directories /home/lylez/Hadoop/hadoop-2.x/hadoop-2.2.0/share/hadoop/yarn/sources /home/lylez/Hadoop/hadoop-2.x/hadoop-2.2.0/share/hadoop/yarn\n\n";

    exit;
}
0
Lyle Z

Eclipseのプロジェクトにリファレンスライブラリを常に追加してから、パッケージブラウザーで、探しているクラスが見つかるまでJARファイル内のパッケージを展開するだけです。

0
Arunabh Das

@Nikita Rybak:AstroGrep for Windowsは私たちの友達です: http://astrogrep.sourceforge.net/

0
NinjaCat