列出多个jar文件的内容

我在一堆jar子里search一个.class文件。

jar tf abc.jar 

适用于一个文件。 我试过了

 find -name "*.jar" | xargs jar tf 

什么也不印。 我能想到的唯一解决方法是解压所有,然后search。 有没有更好的办法? 我在LUnix。

编辑 :当扫描很多jar文件时,打印jar文件名和类是很有用的。 这种方法效果很好:

 find . | grep jar$ | while read fname; do jar tf $fname | grep SchemaBuilder && echo $fname; done 

产生的样本输出:

  1572 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$1.class 1718 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$2.class 42607 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder.class ./XmlSchema-1.3.2.jar 1572 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$1.class 1718 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$2.class 42607 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder.class ./XmlSchema.jar 

Solutions Collecting From Web of "列出多个jar文件的内容"

您需要将-n 1传递给xargs以强制它为从find获得的每个文件名运行单独的jar命令:

 find -name "*.jar" | xargs -n 1 jar tf 

否则, xargs的命令行看起来像jar tf file1.jar file2.jar... ,它具有不同的含义。

一个有用的调试技术是在由xargs运行的命令之前粘贴echo

 find -name "*.jar" | xargs echo jar tf 

这将打印出完整的jar命令,而不是执行它,以便您可以看到它的错误。

您也可以使用find的-exec选项

 find . -name "*.jar" -exec jar tf {} \; 

这是我在Cygwin中使用的。 它按照上面的要求支持每个jar文件的部分头文件。

 find . -name "*.jar" \ -exec echo ======\ {}\ ====== \; \ -exec /c/Program\ Files/Java/jdk1.7.0_45/bin/jar.exe tf {} \; | less 

对于* nix,请删除“.exe”:

 find . -name "*.jar" \ -exec echo ======\ {}\ ====== \; \ -exec jar tf {} \; | less 

我遇到了类似的情况,我需要在目录中存在的jar文件列表中搜索类。 此外,我想知道从哪个jar文件类属于。 我用下面的代码片段(shell脚本),发现是有帮助的。 下面的脚本将列出包含要搜索的类的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 

Shell脚本取自: http : //alvinalexander.com/blog/post/java/shell-script-search-search-multiple-jar-files-class-pattern

您也可以使用比jar更快的解压缩(-l选项来打印zip内容)。

例如,一个小脚本,大致上你想要的:

 #!/bin/bash for i in $(find . -name "*.jar") do if [ -f $i ] then echo $i unzip -l $i | grep $* fi done 

我没有看到使用exec的必要性,这在Windows上的Cygwin中适用于我:

 find . -name "*.jar" | while read jarfile; do unzip -l $jarfile | fgrep "foo" ; done 

如果您正在使用Eclipse,则可以创建一个项目并添加所有jar。 然后你就可以在任何一个罐子里找到一堂课。