找到给出类名的jar文件?

时间:2009-09-30 19:21:16

标签: java jar dependencies

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

例如,给定“com.ibm.websphere.security.auth.WSSubject”,您如何追踪相应的jar文件? (“谷歌”不是我正在寻找的答案!)

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

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

17 个答案:

答案 0 :(得分:80)

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

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

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

$ findclass.sh . WSSubject

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

答案 1 :(得分:14)

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

答案 2 :(得分:12)

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

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:5)

要搜索当前目录下的所有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

答案 5 :(得分:3)

您可以尝试以下服务:

  • 具有搜索功能的maven企业存储库,例如: Nexus(OFC,这只适用于您正在寻找的罐子被编入索引,即安装在存储库中)

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

答案 6 :(得分:3)

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

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

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

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

答案 7 :(得分:3)

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

答案 8 :(得分:2)

在我去的时候打印清单,这样我就可以看到我正在检查的内容。大多数情况下,我正在查找lib / app目录,但您可以用locate替换查找。

e.g。

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

答案 9 :(得分:1)

鉴于您对尝试处理依赖项的评论,我要做的是关注您正在使用的库。知道这一点,你就会知道在类路径上有什么罐子,你可以注意这一点。还有依赖关系管理构建器(Maven和Ant是两个流行的构建器),可以将项目与其依赖项打包在一起。但是,最终,开发人员应该知道他们拥有哪些依赖项,并注意这些依赖项的要求。这就是为什么使用像Eclipse这样的IDE,以及像Maven或Ant这样的构建工具在大型项目中如此优秀的一个原因,就像你有一个项目的20个依赖项一样,这可能变得非常难以管理。

答案 10 :(得分:1)

还有this网站似乎很有用。 {{3P>

答案 11 :(得分:1)

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

答案 12 :(得分:1)

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

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

我建议使用Maven,Eclipse和m2eclipse。

第1步 - 添加特定导入

alt text

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

alt text

答案 16 :(得分:0)

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