对于Java开发人员来说,这一定是一个非常基本的问题,但在给出类名的情况下找到相应的 jar文件的最佳方法是什么?
例如,给定“com.ibm.websphere.security.auth.WSSubject”,您如何追踪相应的jar文件? (“谷歌”不是我正在寻找的答案!)
java docs没有提供任何jar文件的提示,显然jar文件的名称本身并不提供任何线索。
在java世界中必须有一个'搜索本地jar'或某种'自动解析依赖'技巧。理想情况下,我正在寻找“官方”的方式来做到这一点。我碰巧在没有cygwin的Windows机器上。
答案 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)
您可以尝试以下服务:
或
或
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步 - 添加特定导入
第2步 - 查找并下载(自动)所需的jar
答案 16 :(得分:0)
找到.jar | xargs grep com.ibm.websphere.security.auth.WSSubject