有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java列出了多个jar文件的内容

我在找一个新的工作。类文件放在一堆罐子里

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

共 (6) 个答案

  1. # 1 楼答案

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

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

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

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

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

    find . -name "*.jar" | while read jarfile; do unzip -l $jarfile | fgrep "foo" ; done 
    
  4. # 4 楼答案

    以下是我在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
    
  5. # 5 楼答案

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

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

    否则xargs的命令行看起来像jar tf file1.jar file2.jar...,这与预期的含义不同

    一种有用的调试技术是将echo放在xargs运行的命令之前:

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

    这将打印出完整的jar命令,而不是执行它,这样您就可以看到它有什么问题

  6. # 6 楼答案

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

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