【问题标题】:Find for a class file in Linux that is present in JAR在 Linux 中查找 JAR 中存在的类文件
【发布时间】:2013-04-27 16:31:59
【问题描述】:

我正在尝试使用此链接中给出的以下命令查找包含我的课程的 JAR 文件:Find a jar file given the class name?

find . -name "*.jar" -exec sh -c 'jar -tf {}|grep -H --label {} GenericClassLoader' \;

但我收到错误:

java.util.zip.ZipException: error in opening zip file
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(ZipFile.java:131)
        at java.util.zip.ZipFile.<init>(ZipFile.java:92)
        at sun.tools.jar.Main.list(Main.java:997)
        at sun.tools.jar.Main.run(Main.java:242)
        at sun.tools.jar.Main.main(Main.java:1167)

请帮助我理解该命令以及如何解决此错误。我正在使用 bash shell。

【问题讨论】:

    标签: bash unix jar


    【解决方案1】:

    您的文件系统中有一些以*.jar 结尾的东西,但它不是有效的存档。要对此进行调试,请将-print 添加到find 命令:

    find . -name "*.jar" -print -exec ...
    

    这将使find 在尝试执行sh 命令之前打印文件名。

    解释:

    • find .: 找到当前目录下的所有文件和文件夹
    • -name "*.jar" 的名字以.jar 结尾
    • -exec 并为每个人执行以下命令
    • sh -c新建一个shell并执行...
    • jar -tf {} 测试 JAR 存档。这(也)打印存档find 中的文件列表,将{} 替换为它找到的存档路径
    • |jar -tf 的结果通过管道传输到 ...
    • grep 在输入中搜索 ...
    • -H打印每场比赛的文件名
    • --label {} 因为我们从标准输入读取,grep 应该使用 {}(再次被 find 替换)作为文件名
    • GenericClassLoaderjar -tf 的输出中搜索此字符串

    【讨论】:

    • 非常感谢 Aaron,有没有办法隐藏这些错误消息并只显示正确的输出?我可以从输出中找到 jar 文件,但我有近 100 条错误消息
    • {}|之间添加2&gt;&amp;/dev/null'jar -tf {} 2&gt;&amp;/dev/null | grep
    • 我想我在这里遗漏了一些东西,我正在使用这个命令:find . -name "*.jar" -exec sh -c 'jar -tf {} 2&gt;&amp;/dev/null |grep -H --label {} GenericClassLoader' \; 但我收到错误sh: /dev/null: ambiguous redirect,请帮助我。
    • 试试bash -c 而不是sh -c
    • 我得到同样的错误,我正在使用这个命令:find . -name "*.jar" -exec bash -c 'jar -tf {} 2&gt;&amp;/dev/null |grep -H --label {} GenericClassLoader' \;,我仍然得到错误:bash: /dev/null: ambiguous redirect
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多