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

时间:2012-04-26 09:49:21

标签: java jar

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

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

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

10 个答案:

答案 0 :(得分:91)

你可以在linux上使用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" {}'

答案 1 :(得分:4)

警告:这不是一个准确的答案,它只是一种快速的启发式方法。如果你需要找到类的名称(例如,哪个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.

答案 2 :(得分:1)

使用WinRar搜索,在jar中搜索或查找包含特定文本的类名称非常容易。它的高效性始终对我至少起作用。

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

请务必查看以下选项:

1。)在字段的文件名中提供'*'以查找','存档类型'

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

答案 3 :(得分:1)

使用jfind jar

  

JFind可以在文件系统的任何地方找到Java类文件,即使是   它隐藏在拉链内耳内一个罐子里的许多层次!

http://jfind.sourceforge.net/

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

单行解决方案,可打印找到了搜索字符串的文件名,它不会因不必要的“搜索”日志而阻塞控制台:

find libdir -wholename "*.jar" | xargs --replace={} bash -c 'zipgrep "BEGIN REQUEST" {} &>/dev/null; [ $? -eq 0 ] && echo "{}";'

编辑::删除不必要的if语句,并使用-name而不是-wholename(实际上,我使用了全名,但这取决于您的方案和首选项):

find libdir -name "*.jar" | xargs --replace={} bash -c 'zipgrep "BEGIN REQUEST" {} &>/dev/null && echo "{}";'

您也可以使用sh代替bash。 最后一件事,--replace = {}等效于-I {}(我通常使用长选项格式,以避免以后再进入手册。)

答案 6 :(得分:0)

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

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

    find <%PATH of the Folder where you need to search%> -name "*.jar" -print -exec zipgrep "jar$|<%STRING THAT YOU NEED TO FIND>" '{}' \;
    
  2. 在jar文件列表中查找类名。

    find . -name "*.jar" -print -exec jar tvf {} \; |grep -E "jar$|<%CLASS NAME THAT YOU NEED TO FIND>\.class"
    

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

尽管有多种方法可以使用反编译器或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中找到一个特定的类,因此命令将如下所示:

enter image description here