这必须是为Java开发人员一个很基本的问题,但什么是找到给出一个类名相应的jar文件的最好方法?
例如,给定“ com.ibm.websphere.security.auth.WSSubject ”,你怎么追查相应的jar文件? (“谷歌”是不是我要找的答案!)
在Java文档不给jar文件的任何暗示,明显的jar的名称文件本身不提供线索。
必须有一个“搜索本地罐子”,或某种“自动解决依赖”,诱骗在Java世界。 理想情况下,我在寻找的“官方”的方式来做到这一点。 我碰巧是Windows机器上没有cygwin的。
Answer 1:
保存为findclass.sh(或其他),把它放在你的路径上,并使其可执行:
#!/bin/sh
find "$1" -name "*.jar" -exec sh -c 'jar -tf {}|grep -H --label {} '$2'' \;
第一个参数是目录递归搜索和所述第二参数是正则表达式(通常只是一个简单的类名)以进行搜索。
$ findclass.sh . WSSubject
脚本依赖于-t选项jar命令(其中列出的内容)和里grep的内容的每个表中,标记任何匹配与其中发现的JAR文件的路径。
Answer 2:
我写了一个程序是: https://github.com/javalite/jar-explorer它也将编译现有的字节代码向你展示接口,方法,超类,将显示其他资源的内容-文本,图像,HTML等等。
Answer 3:
有没有“官方” Java的方式做到这一点AFAIK。
我通常寻找它的方法是使用查找和罐子通过所有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文件。
Answer 4:
如果你的系统(如Solaris)上的grep的没有-H和--label在丹代尔的例子中,你可以使用:
find . -name '*.jar' -type f | xargs -i bash -c "jar -tvf {}| tr / . | grep WSSubject && echo {}"
Answer 5:
要搜索所有罐子在当前目录下,并返回包含类ABCD做了一个(或多个):
find . -iname *.jar | while read JARF; do jar tvf $JARF | grep a/b/c/D.class && echo $JARF ; done
它会报告类ABCD的(或类似的后缀类)的所有实例,将只打印包含它的罐子。
典型的输出:
$ 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
Answer 6:
你可以尝试的服务,如:
- http://www.jarhoo.com/
- http://www.docjar.com/
- http://javacio.us/
- http://merobase.com/
要么
- 谷歌桌面与Airbear软件的IndexZip插件
要么
- 一个Maven企业资源库和搜索功能如的Nexus(OFC,这只会工作,如果你正在寻找被索引,即安装在仓库中的罐子)
PS:Jarhoo已经与Javacio.us提供10万名Java开发人员通过他们的谷歌搜索结果中整合链接免费获得Jarhoo。 订阅Javacio.us是自由和开放的一个谷歌帐户的任何人。 欲了解更多信息,请访问在Javacio.us Jarhoo报价页面 。
Answer 7:
在Windows中,运行的cmd.exe和类型:
for %i in (*.jar) do @jar tvf %i | find "/com/company/MyClass.class"
这些罐子必须是在当前目录。 对于还拥有A / R选项,将一个目录并让您进行递归搜索。
如果jar.exe的是不是在你的路径,你可以这样做@C:\ JDK \ BIN \ jar.exe的。
Answer 8:
尝试findjar.com。 如果是在公共领域,你应该得到它。 有阿洛斯mavenjava.com(但该网站似乎是向下)
Answer 9:
打印列表,因为我去,所以我可以看到我检查。 主要是我正在寻找在一个lib / app目录中,但您可以替换为定位查找。
如
for jar in $(find some_dir/lib -name "*.jar" );
do
echo -------------$jar-------------------
jar -tf $jar | grep TheNameOfTheClassImLookingFor
done
Answer 10:
鉴于试图处理依赖您的意见,我会做的就是专注于哪些库所使用。 知道了这一点,你就会知道什么罐子必须在类路径中,你可以注意这一点。 也有依赖管理的建设者(Maven和Ant的是两个流行的),可以打包项目,它们的依赖中。 然而,在最后,它是由开发者知道哪些依赖他们,并要注意对这些依赖关系的要求。 这就是为什么使用像Eclipse的IDE和构建工具,如Maven的蚂蚁或在大型项目这么好,因为当你有20个依存关系的一个项目,可以成为非常难以管理的原因之一。
Answer 11:
我用jarscan 。 这是一个可执行的JAR文件,可以递归搜索整个文件夹结构,包含您正在寻找的类罐子。 它通过搜索类的名称,包装名称或正则表达式。
Answer 12:
在Windows PowerShell中,你可以使用此命令。 它列出所有它遇到的JAR文件,但它有一个额外的行这是很容易被发现的地方也找到你的类。
Get-ChildItem -recurse -Filter *.jar | Foreach {echo $_.fullname; c:\somepath\JDK\BIN\jar tvf $_.fullname | Select-String -pattern "Cabbages.class"}
Answer 13:
也有这个网站,这似乎是有用的。 http://www.findjar.com/
Answer 14:
找到的.jar | xargs的grep的com.ibm.websphere.security.auth.WSSubject
Answer 15:
如果你还在寻找WSSubject,然后坛子wssec.jar。 里面sas.jar WSSecurityException类
Answer 16:
我建议使用Maven,Eclipse和m2eclipse的。
第1步 - 添加特定进口
第2步 - 找到并下载(自动)所需的jar
Answer 17:
关于建立丹的出色答卷 ,下面的脚本解决了错位输出的情况下,一些罐子实际上是断符号链接(而在同一时间,不要省略正确的符号连接)的问题,它还会搜索在当前目录下,如果不提供参数。
#!/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
文章来源: Find a jar file given the class name?