【问题标题】:Find a jar file given the class name?找到一个给定类名的jar文件?
【发布时间】:2010-12-02 18:38:47
【问题描述】:

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

例如,给定“com.ibm.websphere.security.auth.WSSubject”,你如何找到合适的 jar 文件? (“google”不是我要找的答案!)

java docs 没有给出 jar 文件的任何提示,显然 jar 文件本身的名称也没有提供任何线索。

Java 世界中一定有“搜索本地 jars”或某种“自动解析依赖项”的技巧。理想情况下,我正在寻找“官方”的方式来做到这一点。我碰巧在没有cygwin的Windows机器上。

【问题讨论】:

  • 您是否正在尝试解决依赖关系?即当你运行你的代码时,它找不到一个类,所以你想把它放在类路径上?
  • 是的,这正是我想要做的。
  • 我认为你问错了问题。我认为您要问的问题类似于“我正在尝试使用 WAS v6.1 开发瘦客户端应用程序。我应该在我的 JVM 类路径中包含哪个 jar 来执行身份验证(可能是 WSSubject)?”根据您实际尝试执行的操作,在 InfoCenter 中搜索“瘦客户端”或“瘦客户端 wssubject”可能就是您要查找的内容。如果您提供详细信息,您可能会得到正确的罐子,而不仅仅是根据下面的答案猜测。
  • 这应该被标记为 Linux/Unix - 在 Windows 中没有用处。

标签: java jar dependencies


【解决方案1】:

您可以尝试以下服务:

或者

或者

  • 具有搜索功能的 Maven 企业存储库,例如Nexus(OFC,仅当您要查找的 jar 已编入索引(即安装在存储库中)时才有效)

PS:Jarhoo 与 Javacio.us 合作,通过与他们的 Google 搜索结果集成的链接为 100,000 名 Java 开发人员提供免费访问 Jarhoo。 Javacio.us 的订阅是免费的,并且对任何拥有 Google 帐户的人开放。欲了解更多信息,请访问Jarhoo offer page at Javacio.us

【讨论】:

  • - jarhoo 需要花钱- docjar 在我的示例 (docjar.com/docs2web/s.jsp?q=WSSubject&t=q&start=0) 中找不到“WSSubject”。必须有 java 开发人员通常使用的“搜索本地 jars”方法.. ?
  • 我希望有一个离线选项。我经常发现自己在处理来自 3rd 方供应商的一些晦涩难懂的罐子。
  • AFAIK,Windows 下没有任何内置功能可以帮助解决此问题。因此,如果排除 cygwin,Googke Desktop 可能是最好的(不是最差的?)选项。
  • @PascalThivent。检查 www.Help4j.com 它将提供 jar 和源。您也可以在此答案中包含此链接。
【解决方案2】:

找到.jar | xargs grep com.ibm.websphere.security.auth.WSSubject

【讨论】:

  • *nix 的好答案,但它在 Windows 上没有帮助(尽管从他的例子来看 *nix 会很好)。
  • 很公平,但是对于不涉及安装 cygwin 的 windows 机器上的 java 开发人员来说,标准方法是什么?
  • 在文件中查找,*.jar,以类为字符串? (实际上不知道这是否有效,但如果 grep 有效,这应该)
【解决方案3】:

没有“官方”的 Java 方式来执行此 AFAIK。

我通常寻找它的方法是使用 findjar 来查看给定树中的所有 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 文件。

【讨论】:

  • 请注意,jar 文件是 zip 文件,jar 中的文件名有效地映射到包和类。
  • 我更喜欢这个,因为它不涉及grep
【解决方案4】:

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

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

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

$ findclass.sh . WSSubject

该脚本依赖于 jar 命令(列出内容)的 -t 选项并 greps 每个目录,并用找到它的 JAR 文件的路径标记任何匹配项。

【讨论】:

  • 我不确定您或 Dave Costa 是否先回答,但这可以解决问题,我可以继续使用此脚本。谢谢!
  • 戴夫第一个回答。他的答案更简单,运行速度更快,但我认为我的答案稍微灵活一些,因为您不必指定完全限定的类名。
  • 这应该被标记为 Linux/Unix - 在 Windows 中没有用处。
  • 这确实很棒,但如果某些 jar 文件碰巧是损坏的符号链接,则会产生错误消息。我在此基础上构建并提供了一个版本来解决此问题作为单独的答案(太长,无法在此处添加为评论):stackoverflow.com/a/47437943/274677
【解决方案5】:

边走边打印列表,以便查看正在检查的内容。大多数情况下,我在 lib/app 目录中查找,但您可以用 locate 代替 find。

例如

for jar in $(find some_dir/lib -name "*.jar" ); 
do
echo -------------$jar-------------------
jar -tf $jar | grep TheNameOfTheClassImLookingFor
done

【讨论】:

    【解决方案6】:

    鉴于您对尝试处理依赖项的评论,我要做的就是关注您正在使用哪些库。知道了这一点,您就会知道类路径上必须有哪些 jar,并且您可以注意这一点。还有一些依赖管理构建器(Maven 和 Ant 是两个流行的构建器),它们可以打包项目及其内部的依赖项。但是,最终,开发人员需要知道他们拥有哪些依赖项,并关注这些依赖项的需求。这就是为什么在大型项目中使用 Eclipse 之类的 IDE 以及 Maven 或 Ant 之类的构建工具如此出色的原因之一,因为当一个项目有 20 个依赖项时,这可能会变得非常难以管理。

    【讨论】:

      【解决方案7】:

      我推荐使用 Maven、Eclipse 和 m2eclipse。

      第 1 步 - 添加特定导入

      第 2 步 - 查找并(自动)下载所需的 jar

      【讨论】:

        【解决方案8】:

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

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

        罐子必须在当前目录中。 For 还有一个 /R 选项,它接受一个目录并让您递归搜索。

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

        【讨论】:

          【解决方案9】:

          如果您的系统(例如 Solaris)上的 grep 没有 Dan Dyer 示例中使用的 -H 和 --label,您可以使用:

          find . -name '*.jar' -type f | xargs -i bash -c "jar -tvf {}| tr / . | grep WSSubject && echo {}"
          

          【讨论】:

            【解决方案10】:

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

            【讨论】:

            • 还有jarfinder.com。但它们似乎都提供了相当过时的罐子版本。在 conrast 中,grepcode.com 在公共代码中保持最新状态,但只能用作提示查看位置以及实际 jar 名称是什么。
            【解决方案11】:

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

            【讨论】:

              【解决方案12】:

              我使用jarscan。它是一个可执行的 jar 文件,可以递归地在整个文件夹结构中搜索包含您要查找的类的 jar。它按类名、包名或正则表达式搜索。

              【讨论】:

              • 在发布多个问题的复制和粘贴样板/逐字答案时要小心,这些往往会被社区标记为“垃圾邮件”。如果您这样做,则通常意味着问题是重复的,因此请标记它们。
              • 对于 windows 使用,我已经将 jarscan.jar 与包含 java -jar %~dp0jarscan.jar -class %1 %2 %3 %4 %5 %6 %7 %8 %9 的 jarscan.bat 一起放入 PATH - 然后它可以与“jarscan ServletRequest”一起使用
              【解决方案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
              

              【讨论】:

                【解决方案14】:

                如果您仍在搜索 WSSubject,那么 jar 就是 wssec.jar。 sas.jar 中的 WSSecurityException 类

                【讨论】:

                  【解决方案15】:

                  在 windows powershell 中,您可以使用此命令。它列出了它遇到的所有 JAR 文件,但它有一个额外的行,很容易发现它也在哪里找到你的类。

                  Get-ChildItem -recurse -Filter *.jar | Foreach {echo $_.fullname; c:\somepath\JDK\BIN\jar tvf $_.fullname | Select-String -pattern "Cabbages.class"}
                  

                  【讨论】:

                    【解决方案16】:

                    还有一个this 网站似乎很有用。 http://www.findjar.com/

                    【讨论】:

                      【解决方案17】:

                      Dan's excellent answer 为基础,以下脚本解决了输出错误的问题,以防某些 jars 实际上是损坏的符号链接(同时没有跳过正确的符号链接)如果没有参数,它还会在当前目录中搜索已提供。

                      #!/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
                      

                      【讨论】:

                        猜你喜欢
                        • 2015-05-17
                        • 2013-09-05
                        • 1970-01-01
                        • 2010-09-21
                        • 2010-11-23
                        • 2017-12-10
                        • 2018-06-29
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多