时间:2011-10-14 15:48:51

标签: java linux shell jar

我在一堆罐子里面搜索一个.class文件。

jar tf abc.jar 

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

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

什么都不打印。我能想到的唯一解决方案是解压缩所有,然后搜索。有没有更好的办法?我在卢尼克斯。

修改: 扫描多个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

9 个答案:

答案 0 :(得分:32)

答案 1 :(得分:2)

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

答案 2 :(得分:1)

您还可以使用find

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

答案 3 :(得分:1)

这是我在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

答案 4 :(得分:0)

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

例如,一个小型脚本大致可以执行您想要的操作:

#!/bin/bash

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

d0 := data[0] // Define d0 as a string
ss := strings.Split(d0, ",") // OK: Define ss as a []string

答案 7 :(得分:0)

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

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

通过运行批处理文件,它将提取目录中的每个jar文件。这里唯一的事情是它将提取到jar文件所在的目录中。

答案 8 :(得分:-1)