多くのjarファイル内で特定のクラス名をどのように見つけますか?
(それを参照するクラスではなく、実際のクラス名を探します。)
Eclipseはそれを行うことができ、(一時的な)プロジェクトを作成し、ライブラリをプロジェクトのクラスパスに配置するだけです。その後、クラスを簡単に見つけることができます。
私の頭に浮かぶもう1つのツールは、Java Decompilerです。一度に多くのjarファイルを開くことができ、クラスの検索にも役立ちます。
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
仕組みは次のとおりです。
for /R %G in (*.jar) do
-すべてのJARファイルをループし、ディレクトリを再帰的に走査します。ファイル名を%Gに保存します。@jar -tvf "%G" |
-Java Archiveコマンドを実行して、指定されたアーカイブ内のすべてのファイル名をリストし、結果を標準出力に書き込みます。 @
シンボルは、コマンドの呼び出しの出力を抑制します。find "ClassName" > NUL
-指定されたクラス名について、jarコマンドの出力からパイプされた標準入力を検索します。これは、一致する場合(そうでない場合は0)、ERRORLEVEL
を1に設定します。&& echo %G
-ERRORLEVEL
がゼロ以外の場合、Javaアーカイブファイル名を標準出力(コンソール)に書き込みます。少し前に、私はそのためのプログラムを書きました: https://github.com/javalite/jar-Explorer
grep -l "classname" *.jar
あなたに瓶の名前を与えます
find . -name "*.jar" -exec jar -t -f {} \; | grep "classname"
クラスのパッケージを提供します
#!/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
この問題に遭遇したとき、私はそれを行うユーティリティを知りませんでしたので、私は次のように書きました:
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();
}
}
}
特定の文字列に一致するjarを見つけるには:
find . -name \*.jar -exec grep -l YOUR_CLASSNAME {} \;
また、「JarScan」と呼ばれる2つの異なるユーティリティがあります。これらは、求めていることを正確に実行します。 JarScan(inetfeedback.com) および JarScan(Java.net)
私はこれを常にWindowsで使用してきましたが、非常にうまく機能しました。
findstr /s /m /c:"package/classname" *.jar, where
findstr.exeはWindowsとparamsに標準で付属しています。
これが誰かを助けることを願っています。
user1207523のスクリプトは私には問題なく機能します。以下は、単純な展開の代わりにfindを使用してjarファイルを検索するバリアントです。
#!/bin/bash
for i in `find . -name '*.jar'`; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done
この新しい方法を見つけました
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に入力できます。
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
ここのスクリプトがなぜ私にとって実際に機能しなかったのかはわかりません。これは動作します:
#!/bin/bash
for i in *.jar; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done
FindClassInJars utilを使用するだけで、単純なSwingプログラムですが、便利です。 http://code.google.com/p/find-class-in-jars/ でソースコードを確認するか、jarファイルをダウンロードできます。
JBossの確認 Tattletale ;個人的に使用したことはありませんが、これが必要なツールのようです。
特定のクラスの特定のディレクトリ内のすべてのjarファイルを検索するには、次のようにします。
ls *.jar | xargs grep -F MyClass
または、さらに簡単に、
grep -F MyClass *.jar
出力は次のようになります。
Binary file foo.jar matches
-Fオプションは固定文字列の検索を意味するため、非常に高速です。したがって、grepの呼び出しごとに正規表現エンジンをロードしません。必要な場合は、常に-Fオプションを省略して正規表現を使用できます。
さらに別のツールを追加するには...これは、Windows用の非常にシンプルで便利なツールです。クリックする単純なexeファイル。検索するディレクトリ、クラス名を指定すると、そのクラスを含むjarファイルが検索されます。はい、再帰的です。
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」のような完全修飾名でもかまいません。
恥知らずな自己宣伝ですが、私が書いたユーティリティを試すことができます: http://sourceforge.net/projects/zfind
最も一般的なアーカイブ/圧縮ファイル(jar、Zip、tar、tar.gzなど)をサポートし、他の多くのjar/Zipファインダーとは異なり、ネストされたZipファイル(Zip内のzip、jar内のjar)を深さ無制限までサポートします。
フォルダー(およびサブフォルダー)の一連の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
次のスクリプトが役立ちます
for file in *.jar
do
# do something on "$file"
echo "$file"
/usr/local/jdk/bin/jar -tvf "$file" | grep '$CLASSNAME'
done
シェルが少し入った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
お探しのジョブを実行できるEclipse用プラグインを確認してください。
Linux環境では、次のことができます。
$ find <base_dir> -name *.jar -print0 | xargs -0 -l jar tf | grep <name>
ここで、nameは、ルートにあるディレクトリの階層全体に分散されたjarファイル内で探しているクラスファイルの名前です。 base_dir.
クラスのインスタンスがある場合、またはインスタンスを取得できる場合、純粋な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行は、クラスのインスタンスまたはクラス名がある場所に応じて調整する必要があります。
これは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
}
上記のすべてに追加する1つのこと:jar実行可能ファイルを使用できない場合(JDKには付属していますが、JREには付属していません)、unzip(またはWinZipなど)を使用して同じことを達成できます。
ファイル名: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」から呼び出すことができます。
locate
およびgrep
を使用できます。
locate jar | xargs grep 'my.class'
updatedb
を使用する前に、必ずlocate
を実行してください。
Eclipseでは、古いがまだ使用可能なプラグインを使用できます jarsearch
Grepj は、jarファイル内のクラスを検索するコマンドラインユーティリティです。私はユーティリティの作成者です。
grepj package.Class my1.jar my2.war my3.ear
のようなユーティリティを実行できます
複数のjar、ear、warファイルを提供できます。高度な使用法では、findを使用して、検索するjarのリストを提供します。
これを使用してください。クラスパス内の任意のファイルを見つけることができます。
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);
}
}
}
}
パーティーに少し遅れましたが、それでも...
JarBrowser を使用して、特定のクラスがどのjarに存在するかを見つけました。使いやすいGUIを使用して、選択したパス内のすべてのjarの内容を参照できます。