Làm thế nào bạn sẽ tìm thấy một tên lớp cụ thể trong rất nhiều tệp jar?
(Tìm kiếm tên lớp thực tế, không phải các lớp tham chiếu nó.)
Làm thế nào bạn sẽ tìm thấy một tên lớp cụ thể trong rất nhiều tệp jar?
(Tìm kiếm tên lớp thực tế, không phải các lớp tham chiếu nó.)
Câu trả lời:
Eclipse có thể làm điều đó, chỉ cần tạo một dự án (tạm thời) và đặt các thư viện của bạn trên đường dẫn dự án. Sau đó, bạn có thể dễ dàng tìm thấy các lớp.
Một công cụ khác, theo ý tôi, là Trình dịch ngược Java. Nó có thể mở rất nhiều lọ cùng một lúc và cũng giúp tìm các lớp.
Trên Linux, các biến thể Unix khác, Git Bash trên Windows hoặc Cygwin, sử dụng jar
(hoặc unzip -v
) grep
và find
các lệnh.
Sau đây liệt kê tất cả các tệp lớp khớp với một tên đã cho:
for i in *.jar; do jar -tvf "$i" | grep -Hsi ClassName && echo "$i"; done
Nếu bạn biết toàn bộ danh sách các tài liệu lưu trữ Java mà bạn muốn tìm kiếm, bạn có thể đặt tất cả chúng trong cùng một thư mục bằng các liên kết (tượng trưng).
Hoặc sử dụng find
(trường hợp nhạy cảm) để tìm tệp JAR chứa tên lớp đã cho:
find path/to/libs -name '*.jar' -exec grep -Hls ClassName {} \;
Ví dụ: để tìm tên của kho lưu trữ chứa IdentityHashingStrategy
:
$ find . -name '*.jar' -exec grep -Hsli IdentityHashingStrategy {} \;
./trove-3.0.3.jar
Nếu JAR có thể ở bất cứ đâu trong hệ thống và locate
lệnh có sẵn:
for i in $(locate "*.jar");
do echo "$i"; jar -tvf "$i" | grep -Hsi ClassName;
done
Một biến thể cú pháp:
find path/to/libs -name '*.jar' -print | \
while read i; do jar -tvf "$i" | grep -Hsi ClassName && echo "$i"; done
Mở một dấu nhắc lệnh , thay đổi thư mục (hoặc thư mục tổ tiên) có chứa các tệp JAR, sau đó:
for /R %G in (*.jar) do @jar -tvf "%G" | find "ClassName" > NUL && echo %G
Đây là cách nó hoạt động:
for /R %G in (*.jar) do
- lặp trên tất cả các tệp JAR, các thư mục duyệt qua đệ quy; lưu trữ tên tập tin trong %G
.@jar -tvf "%G" |
- chạy lệnh Lưu trữ Java để liệt kê tất cả các tên tệp trong kho lưu trữ đã cho và ghi kết quả vào đầu ra tiêu chuẩn; các @
ngăn chặn biểu tượng in gọi của lệnh.find "ClassName" > NUL
- tìm kiếm đầu vào tiêu chuẩn, được lấy từ đầu ra của lệnh jar, cho tên lớp đã cho; cái này sẽ được đặt ERRORLEVEL
thành 1 nếu có một trận đấu (nếu không là 0).&& echo %G
- iff ERRORLEVEL
khác không, ghi tên tệp lưu trữ Java vào đầu ra tiêu chuẩn (bàn điều khiển).Sử dụng một công cụ tìm kiếm quét các tệp JAR .
Cách đây một thời gian, tôi đã viết một chương trình chỉ dành cho điều đó: https://github.com/javalite/jar-explorer
grep -l "classname" *.jar
cho bạn tên của bình
find . -name "*.jar" -exec jar -t -f {} \; | grep "classname"
cung cấp cho bạn gói của lớp
#!/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
jar -tvf
bằng unzip -l
.
Để xác định vị trí các lọ khớp với một chuỗi đã cho:
find . -name \*.jar -exec grep -l YOUR_CLASSNAME {} \;
Tôi không biết một tiện ích để làm điều đó khi tôi gặp phải vấn đề này, vì vậy tôi đã viết như sau:
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();
}
}
}
Ngoài ra còn có hai tiện ích khác nhau được gọi là cả "JarScan" thực hiện chính xác những gì bạn đang yêu cầu: JarScan (inetfeedback.com) và JarScan (java.net)
kịch bản của user1207523 hoạt động tốt với tôi. Đây là một biến thể tìm kiếm các tệp jar theo cách sử dụng find thay vì mở rộng đơn giản;
#!/bin/bash
for i in `find . -name '*.jar'`; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done
Tôi đã luôn sử dụng nó trên Windows và nó hoạt động rất tốt.
findstr /s /m /c:"package/classname" *.jar, where
findstr.exe có tiêu chuẩn với Windows và các thông số:
Hy vọng điều này sẽ giúp được ai đó.
Một bash script
giải pháp sử dụng unzip (zipinfo)
. Đã thử nghiệm trên 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
Để tìm kiếm tất cả các tệp jar trong một thư mục nhất định cho một lớp cụ thể, bạn có thể làm điều này:
ls *.jar | xargs grep -F MyClass
hoặc, thậm chí đơn giản hơn,
grep -F MyClass *.jar
Đầu ra trông như thế này:
Binary file foo.jar matches
Nó rất nhanh vì tùy chọn -F có nghĩa là tìm kiếm chuỗi Cố định, do đó, nó không tải công cụ regex cho mỗi lần gọi grep. Nếu bạn cần, bạn luôn có thể bỏ qua tùy chọn -F và sử dụng biểu thức chính quy.
Tôi tìm thấy cách mới này
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
...
Vì vậy, điều này liệt kê jar và lớp nếu tìm thấy, nếu bạn muốn, bạn có thể cung cấp ls -1 * .jar hoặc nhập vào xargs bằng lệnh find HTH someoneone.
Class Downloader là một chương trình được thiết kế để giải quyết vấn đề này. Nó cho phép bạn tìm kiếm đệ quy thông qua các thư mục và tệp jar để tìm tất cả các phiên bản của một lớp khớp với một mẫu. Nó được viết bằng Java, không phải python. Nó có một GUI đẹp giúp dễ sử dụng. Và nó chạy nhanh. Bản phát hành này được biên dịch sẵn trong một cái lọ có thể chạy được để bạn không phải xây dựng nó từ nguồn.
Tải xuống tại đây: Class Downloader 1.0
Kiểm tra JBoss Tattletale ; Mặc dù tôi chưa bao giờ sử dụng nó cá nhân, đây dường như là công cụ bạn cần.
Chỉ cần sử dụng FindClassInJars, đó là một chương trình swing đơn giản, nhưng hữu ích. Bạn có thể kiểm tra mã nguồn hoặc tải xuống tệp jar tại http://code.google.com.vn/p/find- class-in-jars /
Không chắc chắn tại sao các kịch bản ở đây chưa bao giờ thực sự làm việc cho tôi. Những công việc này:
#!/bin/bash
for i in *.jar; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done
Tập lệnh tìm tập tin 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
Cách sử dụng: ./find_jar.sh <thư mục cấp cao nhất chứa tệp jar> <Tên lớp cần tìm>
Điều này tương tự với hầu hết các câu trả lời được đưa ra ở đây. Nhưng nó chỉ xuất ra tên tệp, nếu grep tìm thấy thứ gì đó. Nếu bạn muốn triệt tiêu đầu ra grep, bạn có thể chuyển hướng đó sang / dev / null nhưng tôi thích xem đầu ra của grep hơn để tôi có thể sử dụng tên lớp một phần và tìm ra tên chính xác từ danh sách đầu ra được hiển thị.
Tên lớp có thể là cả tên lớp đơn giản như "Chuỗi" hoặc tên đủ điều kiện như "java.lang.String"
Để thêm một công cụ khác ... đây là một công cụ rất đơn giản và hữu ích cho các cửa sổ. Một tệp exe đơn giản mà bạn nhấp vào, cung cấp cho nó một thư mục để tìm kiếm, một tên lớp và nó sẽ tìm thấy tệp jar chứa lớp đó. Vâng, đó là đệ quy.
Để tìm một lớp trong một thư mục (và các thư mục con), các tệp 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
Thí dụ:
java -jar jarscan.jar -dir C:\Folder\To\Search -showProgress -class GenericServlet
tự quảng cáo không biết xấu hổ, nhưng bạn có thể thử một tiện ích tôi đã viết: http://sourceforge.net/projects/zfind
Nó hỗ trợ hầu hết các tệp lưu trữ / nén phổ biến (jar, zip, tar, tar.gz, v.v.) và không giống như nhiều công cụ tìm jar / zip khác, hỗ trợ các tệp zip lồng nhau (zip trong zip, jar trong jar, v.v.) cho đến độ sâu không giới hạn.
Đến bữa tiệc muộn một chút, tuy nhiên ...
Tôi đã sử dụng JarBrowser để tìm trong đó một lớp cụ thể có mặt. Nó có một GUI dễ sử dụng cho phép bạn duyệt qua nội dung của tất cả các lọ trong đường dẫn đã chọn.
Kịch bản sau đây sẽ giúp bạn ra ngoài
for file in *.jar
do
# do something on "$file"
echo "$file"
/usr/local/jdk/bin/jar -tvf "$file" | grep '$CLASSNAME'
done
Cái này hoạt động tốt trong MinGW (môi trường bash windows) ~ gitbash
Đặt chức năng này vào tệp .bashrc trong thư mục HOME của bạn:
# 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
}
Grepj là một tiện ích dòng lệnh để tìm kiếm các lớp trong các tệp jar. Tôi là tác giả của tiện ích.
Bạn có thể chạy các tiện ích như grepj package.Class my1.jar my2.war my3.ear
Nhiều tập tin jar, tai, chiến tranh có thể được cung cấp. Để sử dụng nâng cao, sử dụng find để cung cấp danh sách các lọ cần tìm kiếm.
Kiểm tra Plugin này để xem nhật thực có thể thực hiện công việc bạn đang tìm kiếm.
Bạn có thể sử dụng locate
và grep
:
locate jar | xargs grep 'my.class'
Hãy chắc chắn rằng bạn chạy updatedb
trước khi sử dụng locate
.