【问题标题】:List contents of multiple jar files列出多个jar文件的内容
【发布时间】:2011-12-07 21:12:21
【问题描述】:

我正在一堆 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

【问题讨论】:

  • 您的编辑正是我想要的。谢谢

标签: java linux shell jar


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您需要将-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 -name "*.jar" | xargs -n 1 jar tf 显示正在显示哪个文件的内容?
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      您还可以使用比 jar 更快的 unzip(打印 zip 内容的 -l 选项)。

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          我遇到了类似的情况,我需要在目录中存在的 jar 文件列表中搜索一个类。另外我想知道该类属于哪个jar文件。我在下面的代码 sn-p(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

          【讨论】:

          • 请尝试添加更多上下文,而不仅仅是发布链接,因为它将来可能会过时。
          • 感谢您的意见 piet.t@ 和 mjuarez@。相应地更新了我的答案。随时提供您的意见。谢谢!
          • 想知道为什么这么慢?
          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            查找 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
            

            【讨论】:

              【解决方案9】:

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

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

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

              【讨论】:

                猜你喜欢
                • 2014-06-28
                • 1970-01-01
                • 2013-10-21
                • 1970-01-01
                • 2021-06-04
                • 1970-01-01
                • 1970-01-01
                • 2016-07-10
                • 2010-09-24
                相关资源
                最近更新 更多