java-如何在JAR文件中搜索字符串

我的应用程序基于Java EE构建。

我在此应用程序中大约有50个罐子。

是否可以搜索特定的关键字(实际上我想搜索关键字BEGIN REQUEST)?

user1253847 asked 2020-02-15T14:02:16Z

8个解决方案

105 votes

您可以在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 | xargs -I{} sh -c 'echo searhing in "{}"; zipgrep "BEGIN REQUEST" {}'

Kalpak Gadre answered 2020-02-15T14:02:47Z

4 votes

警告:这不是一个准确的答案,只是一个快速的启发式方法。 如果您需要查找某个类的名称(例如,哪个jar具有Foo类?)或某个方法的名称,则可以使用该名称。

grep --text 'your string' your.jar

这将搜索jar文件,就好像它是文本一样。 这样比较快,因为它不会扩展存档,但这也是为什么它不那么准确的原因。 如果您需要详尽无遗,那么这不是您应该使用的方法,但是如果您想更快地尝试一些方法,然后再退出-a, --text

Process a binary file as if it were text; this is equivalent

to the --binary-files=text option.,这是一个很好的方法。

从-a, --text

Process a binary file as if it were text; this is equivalent

to the --binary-files=text option.,

-a, --text

Process a binary file as if it were text; this is equivalent

to the --binary-files=text option.

Captain Man answered 2020-02-15T14:03:21Z

2 votes

在android中,我不得不在jar和aar文件中搜索某个字符串,而我一直在寻找这是我在mac上的实现:

find . -name "*.jar" -o -name "*.aar" | xargs -I{} zipgrep "AssestManager" {}

本质上是查找当前目录中的所有jar和aar文件(默认情况下find命令是递归的),将结果通过管道传递给zipgrep并通过xargs将每个文件名作为参数应用。 末尾的括号告诉xargs将从find命令获得的文件名放在哪里。 如果要搜索整个主目录,只需更改find即可。 找到〜

j2emanue answered 2020-02-15T14:03:47Z

1 votes

使用WinRar搜索非常容易在jar内进行搜索或查找包含特定文本的类名。 它高效并且至少对我有用。

只需在WinRar中打开任何jar,单击“ ..”,直到到达您要开始搜索的顶部文件夹(包括子文件夹)。

确保检查以下选项:

1.)在“要查找的文件名”,“存档类型”字段中提供“ *”

2.)选中“在子文件夹中查找”,“在文件中查找”,“在档案中查找”复选框。

tigersagar answered 2020-02-15T14:04:25Z

0 votes

以下命令显示带有文件名和jar文件名的结果。

在jar文件列表中查找字符串。

find -name "*.jar" -print -exec zipgrep "jar$|" '{}' \;

在jar文件列表中查找类名。

find . -name "*.jar" -print -exec jar tvf {} \; |grep -E "jar$|\.class"

JKI answered 2020-02-15T14:05:02Z

0 votes

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

AndreyT answered 2020-02-15T14:05:23Z

0 votes

使用jfind jar

JFind可以在文件系统上的任何位置找到Java类文件,即使   它被藏在拉链的耳朵内的一个罐子里深处的许多层中!

[http://jfind.sourceforge.net/]

liams62217 answered 2020-02-15T14:05:52Z

0 votes

在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 ...

Michael C Good answered 2020-02-15T14:06:21Z