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

Posted

技术标签:

【中文标题】找到一个给定类名的jar文件?【英文标题】:Find a jar file given the class name? 【发布时间】: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 中没有用处。 Find a class somewhere inside dozens of JAR files?的可能重复 【参考方案1】:

您可以尝试以下服务:

http://www.jarhoo.com/ http://www.docjar.com/ http://javacio.us/ http://merobase.com/

或者

带有Airbear Software's IndexZip Plug-in 的Google 桌面

或者

具有搜索功能的 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 文件碰巧是损坏的符号链接,则会产生错误消息。我在此基础上构建并提供了一个版本来解决此问题作为单独的答案(太长,无法在此处添加为评论):***.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

【讨论】:

以上是关于找到一个给定类名的jar文件?的主要内容,如果未能解决你的问题,请参考以下文章

反编译,修改jar文件

java 加载的不同的jar包中有相同的类名怎么办调用到自己需要的类

如何通过一个类名找到它属于哪个jar包

如何找到给定类名的包名?

JRE扩展与jar文件

怎么打包jar文件啊,为啥我打包的jar不能运行啊