我的应用程序是基于 Java EE 构建的。
我的这个应用程序中有大约 50 个罐子。
是否可以搜索特定的关键字(其实我想搜索一个关键字
BEGIN REQUEST
)?
您可以在 Linux 或 OSX 上使用 zipgrep:
zipgrep "BEGIN REQUEST" file.jar
如果您想搜索多个罐子,请执行
find libdir -name "*.jar" -exec zipgrep "BEGIN REQUEST" '{}' \;
其中
libdir
是包含所有 jar 的目录。该命令也会递归搜索子目录。
对于 Windows,您可以下载 cygwin 并在其下安装 zipgrep:http://www.cygwin.com/
编辑1
要查看找到表达式的文件的名称,
find libdir -name "*.jar" | xargs -I{} sh -c 'echo searching in "{}"; zipgrep "BEGIN REQUEST" {}'
编辑2
编辑 1 的简化版本
find libdir -name "*.jar" -print -exec zipgrep "BEGIN REQUEST" '{}' \;
警告:这不是一个准确的答案,它只是一个快速的启发式方法。如果您需要查找类名称之类的内容(例如,哪个 jar 有类 Foo?)或者方法名称,那么这可能会起作用。
grep --text 'your string' your.jar
这将像搜索文本一样搜索 jar 文件。这更快,因为它不会扩展存档,但这也是它不太准确的原因。如果您需要详尽无遗,那么这不是您应该使用的方法,但如果您想在退出之前更快地尝试一些东西
zipgrep
这是一个很好的方法。
来自
man grep
,
-a, --text Process a binary file as if it were text; this is equivalent to the --binary-files=text option.
在android中,我必须在jar和aar文件中搜索我正在寻找的某个字符串,这是我在mac上的实现:
find . -name "*.jar" -o -name "*.aar" | xargs -I{} zipgrep "AssestManager" {}
本质上查找当前目录中的所有 jar 和 aar 文件(默认情况下 find 命令是递归的)将结果通过管道传输到 zipgrep 并通过 xargs 将每个文件名作为参数应用。末尾的括号告诉 xargs 将从 find 命令获得的文件名放在哪里。如果您想搜索整个主目录,只需更改 find .找到~
使用 WinRar 搜索在 jar 内搜索或查找包含特定文本的类名非常容易。它很有效率,至少对我来说总是有效。
只需在 WinRar 中打开任何 jar,单击“..”,直到到达要开始搜索的顶部文件夹(包括子文件夹)。
请务必检查以下选项:
1.) 在“要查找的文件名”、“存档类型”字段中提供“*”
2.) 选择复选框“在子文件夹中查找”、“在文件中查找”、“在档案中查找”。
在 alvinalexander.com 上找到以下脚本。它很简单,但对于搜索当前目录中的所有 jar 文件很有用
#!/bin/sh
LOOK_FOR="codehaus/xfire/spring"
for i in `find . -name "*jar"`
do
echo "Looking in $i ..."
jar tvf $i | grep $LOOK_FOR > /dev/null
if [ $? == 0 ]
then
echo "==> Found \"$LOOK_FOR\" in $i"
fi
done
将“codehaus...”替换为您的查询,即类名。
输出示例:
$ ./searchjars.sh
Looking in ./activation-1.1.jar ...
Looking in ./commons-beanutils-1.7.0.jar ...
Looking in ./commons-codec-1.3.jar ...
Looking in ./commons-pool.jar ...
Looking in ./jaxen-1.1-beta-9.jar ...
Looking in ./jdom-1.0.jar ...
Looking in ./mail-1.4.jar ...
Looking in ./xbean-2.2.0.jar ...
Looking in ./xbean-spring-2.8.jar ...
Looking in ./xfire-aegis-1.2.6.jar ...
Looking in ./xfire-annotations-1.2.6.jar ...
Looking in ./xfire-core-1.2.6.jar ...
Looking in ./xfire-java5-1.2.6.jar ...
Looking in ./xfire-jaxws-1.2.6.jar ...
Looking in ./xfire-jsr181-api-1.0-M1.jar ...
Looking in ./xfire-spring-1.2.6.jar ...
==> Found "codehaus/xfire/spring" in ./xfire-spring-1.2.6.jar
Looking in ./XmlSchema-1.1.jar ...
打印找到搜索字符串的文件名的单行解决方案,它不会因不必要的“搜索”日志而堵塞您的控制台::
find libdir -wholename "*.jar" | xargs --replace={} bash -c 'zipgrep "BEGIN REQUEST" {} &>/dev/null; [ $? -eq 0 ] && echo "{}";'
编辑::删除不必要的if语句,并使用-name代替-wholename(实际上,我使用了wholename,但这取决于你的场景和偏好)::
find libdir -name "*.jar" | xargs --replace={} bash -c 'zipgrep "BEGIN REQUEST" {} &>/dev/null && echo "{}";'
您还可以使用 sh 代替 bash。 最后一件事,--replace={} 相当于 -I{} (我通常使用长选项格式,以避免稍后再次进入手册)。
Fastjar - 很旧,但适合您的需求。 Fastjar 包含名为 jargrep(或 grepjar)的工具。使用方式与 grep 相同:
> locate .jar | grep hibernate | xargs grepjar -n 'objectToSQLString'
org/hibernate/type/EnumType.class:646:objectToSQLString
org/hibernate/sql/Update.class:576:objectToSQLString
org/hibernate/sql/Insert.class:410:objectToSQLString
org/hibernate/usertype/EnhancedUserType.class:22:objectToSQLString
org/hibernate/persister/entity/SingleTableEntityPersister.class:2713:objectToSQLString
org/hibernate/hql/classic/WhereParser.class:1910:objectToSQLString
org/hibernate/hql/ast/tree/JavaConstantNode.class:344:objectToSQLString
org/hibernate/hql/ast/tree/BooleanLiteralNode.class:240:objectToSQLString
org/hibernate/hql/ast/util/LiteralProcessor.class:1363:objectToSQLString
org/hibernate/type/BigIntegerType.class:114:objectToSQLString
org/hibernate/type/ShortType.class:189:objectToSQLString
org/hibernate/type/TimeType.class:307:objectToSQLString
org/hibernate/type/CharacterType.class:210:objectToSQLString
org/hibernate/type/BooleanType.class:180:objectToSQLString
org/hibernate/type/StringType.class:166:objectToSQLString
org/hibernate/type/NumericBooleanType.class:128:objectToSQLString
org/hibernate/type/CustomType.class:543:objectToSQLString
org/hibernate/type/TimeZoneType.class:204:objectToSQLString
org/hibernate/type/DateType.class:343:objectToSQLString
org/hibernate/type/LiteralType.class:18:objectToSQLString
org/hibernate/type/ByteType.class:189:objectToSQLString
org/hibernate/type/LocaleType.class:259:objectToSQLString
org/hibernate/type/CharBooleanType.class:171:objectToSQLString
org/hibernate/type/TimestampType.class:409:objectToSQLString
org/hibernate/type/CurrencyType.class:256:objectToSQLString
org/hibernate/type/AbstractCharArrayType.class:219:objectToSQLString
org/hibernate/type/FloatType.class:177:objectToSQLString
org/hibernate/type/DoubleType.class:173:objectToSQLString
org/hibernate/type/LongType.class:223:objectToSQLString
org/hibernate/type/IntegerType.class:188:objectToSQLString
以下命令显示结果以及文件名和 jar 文件名。
在jar文件列表中查找字符串。
find <%PATH of the Folder where you need to search%> -name "*.jar" -print -exec zipgrep "jar$|<%STRING THAT YOU NEED TO FIND>" '{}' \;
在jar文件列表中查找类名。
find . -name "*.jar" -print -exec jar tvf {} \; |grep -E "jar$|<%CLASS NAME THAT YOU NEED TO FIND>\.class"
使用 jfind jar
JFind 可以在文件系统上的任何位置查找 Java 类文件,即使 它隐藏在一个罐子里,深藏在一个耳朵里的拉链里!
虽然有一些方法可以使用反编译器或 Eclipse 来完成此操作,但是当这些 jar 不属于您的项目时,它会变得很棘手,或者当使用反编译器并且您将数百或数千个 jar 放置在多个文件夹中时尤其痛苦。
我发现 this CMD 命令很有用,它有助于在目录中存在的 jar 列表中查找类名。
forfiles /S /M *.jar /C "cmd /c jar -tvf @file | findstr "classname" && echo @path
您可以导航到所需的路径,然后从那里打开 cmd 并运行此命令,或者直接在命令本身中给出路径,如下所示
forfiles /S /M *.jar /C "cmd /c jar -tvf @file | findstr /C:"classname" && echo @path
我的用例是在 Glassfish 中查找特定的类,因此命令将如下所示:
ugrep 可以做到这一点,并且可用于许多操作系统。
PS C:\temp\mywebapp> ugrep -z "Entity Resolver"
WEB-INF\lib\jaxws-rt-2.3.5.jar{com/sun/xml/ws/util/resources/Messages_en.properties}:P-065 = Entity Resolver did not provide SYSTEM id; may affect relative URIs
WEB-INF\lib\jaxws-rt-2.3.5.jar{com/sun/xml/ws/util/resources/Messages_en_de.properties}:P-065 = Entity Resolver hat keine SYSTEM-ID angegeben. Dies kann sich auf relative URIs auswirken
WEB-INF\lib\jaxb-xjc-2.3.5.jar{com/sun/xml/dtdparser/resources/Messages.properties}:P-065 = Entity Resolver did not provide SYSTEM id; may affect relative URIs
WEB-INF\lib\woodstox-core-6.2.8.jar{com/ctc/wstx/shaded/msv_core/scanner/dtd/resources/Messages_en.properties}:P-065 = Entity Resolver did not provide SYSTEM id; may affect relative URIs
PS C:\temp\mywebapp>
注意:您将需要“-z”参数。否则 ZIP(和其他存档类型)将不会被搜索:
PS C:\temp\mywebapp> ugrep "Entity Resolver"
PS C:\temp\mywebapp>
还有许多其他高级存档选项:
https://ugrep.com/#commands:~:text=and%20its%20argument-,Archives%20and%20compressed%20files,-%2Dz
Archives and compressed files
-z
also search zip/7z/tar/pax/cpio archives, tarballs and gz/Z/bz/bz2/lzma/xz/lz4/zstd/brotli compressed files
-z --zmax=2
also search archives, tarballs and compressed files stored within archives (max 2 levels)
-z -I --zmax=2
same as above, but ignore binary files and also those in (nested) archives and compressed files
-z -tc,cpp
search C and C++ source code files and also those in archives, see also ug -tlist for a list of file types
-z -g"*.txt,*.md"
search files matching the globs *.txt and *.md and also those in archives, see also ug --help globs
-z -g"^bak/"
exclude all bak directories from the search and skip those in archives, see also ug --help globs