Java 列出多个jar文件的内容

Java 列出多个jar文件的内容,java,linux,shell,jar,Java,Linux,Shell,Jar,我正在一堆JAR中搜索.class文件 jar tf abc.jar 适用于一个文件。我试过了 find -name "*.jar" | xargs jar tf 不打印任何内容。我能想到的唯一解决办法是,全部解压,然后搜索。有更好的办法吗?我在LUnix上 编辑: 当扫描许多jar时,打印jar文件名和类是很有用的。这种方法效果很好: find . | grep jar$ | while read fname; do jar tf $fname | grep SchemaBuilder

我正在一堆JAR中搜索.class文件

jar tf abc.jar 
适用于一个文件。我试过了

find -name "*.jar" | xargs jar tf
不打印任何内容。我能想到的唯一解决办法是,全部解压,然后搜索。有更好的办法吗?我在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

如果您使用的是Eclipse,那么可以创建一个项目并添加所有JAR。然后,您将能够在任何jar中找到一个类。

您需要将
-n1
传递给
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 {} \;

您还可以使用解压,它比jar更快(-l选项用于打印zip内容)

例如,一个小脚本大致实现了您想要的功能:

#!/bin/bash

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

以下是我在Cygwin中使用的内容。它支持上面请求的每个jar文件的节头

find . -name "*.jar" \
 -exec echo ======\ {}\ ====== \; \
 -exec /c/Program\ Files/Java/jdk1.7.0_45/bin/jar.exe tf {} \; | less
对于*nix,删除“.exe”:


我遇到了类似的情况,我需要在目录中的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脚本取自:

我不认为有必要使用exec,这在Windows上的Cygwin中对我有效:

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

查找jar文件并将所有类和成员保存在txt上

(for j in $(find -name '*.jar');do echo "--$j --";jar tf $j | grep .class | sed 's#/#.#g' | sed 's/.class/ /g' | xargs -n 1 javap -classpath  $j ; done;) >> classes.txt

如果您要回答此问题,并且需要在windows环境中提取所有jar文件,请导航到保存所有jar文件的目录,并保存包含以下内容的批处理文件:

for /r %%f in (*) do jar -xvf %%f

通过运行批处理文件,它将提取目录中的每个jar文件。这里唯一的一点是,它将在jar文件所在的同一目录中进行解压缩。

您的编辑正是我想要的。感谢带有“echo”的Cellent提示您能否修改命令find-name“*.jar”| xargs-n1 jar tf以显示正在显示的文件内容?请尝试添加更多上下文,而不仅仅是发布链接,因为它将来可能会过时。感谢您的输入piet.t@andmjuarez@. 相应地更新了我的答案。请随时提供您的意见。谢谢不知道为什么这么慢?
for /r %%f in (*) do jar -xvf %%f