代码之家  ›  专栏  ›  技术社区  ›  Jeffrey Knight

找到一个给定类名的JAR文件?

  •  62
  • Jeffrey Knight  · 技术社区  · 15 年前

    对于Java开发人员来说,这是一个非常基本的问题,但什么是找到合适的最佳方法呢? jar文件 给定一个 类名 ?

    例如,给定“ com.ibm.websphere.security.auth.WSSubject “,如何跟踪适当的JAR文件?(谷歌不是我要找的答案!)

    这个 java docs 不要给出JAR文件的任何提示,显然JAR文件本身的名称没有提供任何提示。

    必须有一个“搜索本地JAR”,或者某种“自动解析依赖性”,在Java世界中作弊。理想情况下,我正在寻找“官方”的方式来做这件事。我正好在没有cygwin的windows机器上。

    17 回复  |  直到 7 年前
        1
  •  80
  •   Dan Dyer    15 年前

    将其另存为findclass.sh(或其他),将其放在您的路径上并使其可执行:

    #!/bin/sh
    find "$1" -name "*.jar" -exec sh -c 'jar -tf {}|grep -H --label {} '$2'' \;
    

    第一个参数是递归搜索的目录,第二个参数是要搜索的正则表达式(通常只是简单的类名)。

    $ findclass.sh . WSSubject
    

    该脚本依赖于jar命令的-t选项(其中列出了内容),并对每个内容表进行greps操作,将任何匹配项标记为找到它的jar文件的路径。

        2
  •  14
  •   ipolevoy    10 年前

    我为此编写了一个程序: https://github.com/javalite/jar-explorer 它还将对现有的字节代码进行反编译,以向您显示接口、方法、超级类,并显示其他资源(文本、图像、HTML等)的内容。

        3
  •  12
  •   Dave Costa    15 年前

    没有任何“官方”Java方式来实现这一目标。

    我通常寻找它的方法是 找到 罐子 查看给定树中的所有JAR文件。

    > find . -name \*.jar -print -exec jar tf {} oracle/sql/BLOB.class \;
    ./v2.6.1/lib/csw_library.jar
    ./v2.6.1/lib/oracle_drivers_12_01.jar
    oracle/sql/BLOB.class
    

    如果您在Windows上,不想安装Cygwin,那么我想您必须编写一个批处理脚本来定位JAR文件。

        4
  •  5
  •   Stephen Muench    15 年前

    如果系统上的grep(例如solaris)没有丹·戴尔示例中使用的-h和--label,则可以使用:

    find . -name '*.jar' -type f | xargs -i bash -c "jar -tvf {}| tr / . | grep WSSubject && echo {}"
    
        5
  •  5
  •   Marcus Junius Brutus    13 年前

    要搜索当前目录下的所有JAR并返回包含类A.B.C.D的JAR,请执行以下操作:

    find . -iname *.jar | while read JARF; do jar tvf $JARF | grep a/b/c/D.class && echo $JARF ; done
    

    它将报告类A.B.C.D(或具有类似后缀的类)的所有实例,并且只打印包含它的jar。

    典型输出:

    $ find . -iname *.jar | while read JARF; do jar tvf $JARF | grep Log.class && echo $JARF ; done
    479 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/Log.class
    3714 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/impl/Log4JCategoryLog.class
    1963 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/impl/NoOpLog.class
    9065 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/impl/SimpleLog.class
    ./WebContent/WEB-INF/lib/commons-logging.jar
    
        6
  •  3
  •   Pascal Thivent    15 年前

    您可以尝试以下服务:

    • 一个具有搜索功能的Maven企业存储库,例如nexus(ofc,这只有当您要查找的jar被编入索引(即安装在存储库中)时才有效)

    PS: Jarhoo已经与JavaCio.US合作,为100000个Java开发者提供了免费访问JARHOO的链接,这些链接与谷歌的搜索结果集成在一起。订阅javacio.us是免费的,并且对任何拥有谷歌帐户的人开放。有关更多信息,请访问 Jarhoo offer page at Javacio.us .

        7
  •  3
  •   Yishai    15 年前

    在Windows中,运行cmd.exe并键入:

      for %i in (*.jar) do @jar tvf %i | find "/com/company/MyClass.class"
    

    jar必须在当前目录中。for还有一个a/r选项,它接受一个目录并允许您递归搜索。

    如果jar.exe不在您的路径中,您可以执行@c:\jdk\bin\jar.exe之类的操作。

        8
  •  3
  •   Joseph    15 年前

    试试findjar.com。如果它在公共领域,你应该得到它。有一个alos mavenjava.com(但那个网站似乎已经关闭了)

        9
  •  2
  •   Steve B.    15 年前

    我一边走一边打印清单,这样我就能看到我在检查什么。大多数情况下,我在一个lib/app目录中查找,但您可以用locate替代这个查找。

    例如

    for jar in $(find some_dir/lib -name "*.jar" ); 
    do
    echo -------------$jar-------------------
    jar -tf $jar | grep TheNameOfTheClassImLookingFor
    done
    
        10
  •  1
  •   aperkins    15 年前

    考虑到您对尝试处理依赖项的意见,我将重点关注您正在使用的库。知道了这一点,你就会知道jars在类路径上必须是什么,你可以注意到这一点。还有依赖性管理构建器(Maven和Ant是两个流行的构建器),它们可以将项目与其内部的依赖性打包在一起。然而,最后,由开发人员决定他们拥有哪些依赖关系,并注意这些依赖关系的需求。这就是为什么在大型项目中使用像Eclipse这样的IDE和Maven或Ant这样的构建工具非常好的原因之一,比如当一个项目有20个依赖项时,这些依赖项会变得非常难以管理。

        11
  •  1
  •   Mike Pone    13 年前

    我用 jarscan . 它是一个可执行的JAR文件,可以在整个文件夹结构中递归搜索包含您要查找的类的JAR。它按类名、包名或regex进行搜索。

        12
  •  1
  •   WoodenKitty    11 年前

    在Windows PowerShell中,可以使用此命令。它列出了它遇到的所有JAR文件,但是它有一个额外的行,很容易找到它也可以找到类的地方。

    Get-ChildItem -recurse -Filter *.jar | Foreach {echo $_.fullname; c:\somepath\JDK\BIN\jar tvf $_.fullname | Select-String -pattern "Cabbages.class"}
    
        13
  •  1
  •   Ron Tuffin    11 年前

    也有 this 似乎有用的网站。 http://www.findjar.com/

        14
  •  0
  •   Paul Tomblin    15 年前

    定位.jar_xargs grep com.ibm.websphere.security.auth.wssubject

        15
  •  0
  •   Som    12 年前

    如果仍在搜索wssubject,则jar是wssec.jar。sas.jar内的wsSecurityException类

        16
  •  0
  •   Spooky Muscothym    10 年前

    我建议使用maven、eclipse和m2eclipse。

    步骤1-添加特定导入

    alt text

    步骤2-查找并下载(自动)所需JAR

    alt text

        17
  •  0
  •   Marcus Junius Brutus    7 年前

    建立在 Dan's excellent answer ,下面的脚本解决了一些JAR实际上断开符号链接(同时不跳过适当的符号链接)时输出损坏的问题。如果没有提供参数,它还会在当前目录中搜索。

    #!/usr/bin/env bash
    
    if [[ ($# -ne 1) && ($# -ne 2) ]]
    then
        echo "usage is $0 <grep RegEx to look for in contents of jar> [<top-of-folder-hierarchy> or, if missing, current dir]"
    else
        REG_EXP=$1
        DIR=${2:-.}
        if [ ! -d $DIR ]; then
            echo "directory [$DIR] does not exist";
            exit 1;
        fi
        find "$DIR" -name "*.jar" -exec sh -c '
        (test -e {})
        exitStatus=$?
        if [ "$exitStatus" -eq 0 ]; then # this is done to avoid broken symlinks
            jar -tf {}|grep -i -H --label {} '$REG_EXP'
        fi
    ' \;
    fi