Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 找到给定类名的jar文件?_Java_Jar_Dependencies - Fatal编程技术网

Java 找到给定类名的jar文件?

Java 找到给定类名的jar文件?,java,jar,dependencies,Java,Jar,Dependencies,对于Java开发人员来说,这一定是一个非常基本的问题,但是在给定类名的情况下,找到合适的jar文件的最佳方法是什么 例如,给定“”,如何跟踪适当的jar文件?(“谷歌”不是我想要的答案!) 文件没有给出任何关于jar文件的提示,显然jar文件本身的名称也没有提供任何线索 在java世界中,必须有“搜索本地JAR”或某种“自动解析依赖项”技巧。理想情况下,我正在寻找“官方”的方法来实现这一点。我碰巧在没有cygwin的windows计算机上。您可以尝试以下服务: 或 谷歌桌面 或

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

例如,给定“”,如何跟踪适当的jar文件?(“谷歌”不是我想要的答案!)

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


在java世界中,必须有“搜索本地JAR”或某种“自动解析依赖项”技巧。理想情况下,我正在寻找“官方”的方法来实现这一点。我碰巧在没有cygwin的windows计算机上。

您可以尝试以下服务:

  • 谷歌桌面

  • 具有搜索功能的maven企业存储库,例如Nexus(OFC,只有在您要查找的JAR被编入索引(即安装在存储库中)时,这才有效)

注:Jarhoo与Javacio.us合作,通过与谷歌搜索结果集成的链接,为100000名Java开发人员提供免费访问Jarhoo的机会。Javacio.us的订阅是免费的,对任何拥有谷歌帐户的人开放。有关更多信息,请访问。

locate.jar | xargs grep com.ibm.websphere.security.auth.WSSubject

没有“官方”的Java方法来完成此操作

我通常寻找它的方法是使用查找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文件。

将其另存为findclass.sh(或其他任何文件),将其放在路径上并使其可执行:

#!/bin/sh
find "$1" -name "*.jar" -exec sh -c 'jar -tf {}|grep -H --label {} '$2'' \;
第一个参数是要递归搜索的目录,第二个参数是要搜索的正则表达式(通常只是一个简单的类名)

$ findclass.sh . WSSubject

该脚本依赖于jar命令的-t选项(列出内容),并对每个目录进行greps处理,将所有匹配项标记为找到它的jar文件的路径。

一边打印列表,以便查看正在检查的内容。我主要是在lib/app目录中查找,但是您可以用locate代替find

e、 g


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

我建议使用Maven、Eclipse和m2eclipse

步骤1-添加特定导入

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


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

  for %i in (*.jar) do @jar tvf %i | find "/com/company/MyClass.class"
jar必须位于当前目录中。For还有一个a/R选项,它接受一个目录并允许递归搜索


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

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

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

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

我为此编写了一个程序:
它还将反编译现有字节码,向您显示接口、方法、超类,并显示其他资源的内容—文本、图像、html等。

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

搜索当前目录下的所有JAR,并返回包含类a.b.c.D do a的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

如果您仍然在搜索WSSubject,那么jar就是wssec.jar。sas.jar中的WSSecurityException类在windows powershell中,您可以使用此命令。它列出了它遇到的所有JAR文件,但它有一行额外的内容,很容易找到它在哪里也可以找到您的类

Get-ChildItem -recurse -Filter *.jar | Foreach {echo $_.fullname; c:\somepath\JDK\BIN\jar tvf $_.fullname | Select-String -pattern "Cabbages.class"}
还有一个网站似乎很有用。

基于此,下面的脚本解决了一些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
#/usr/bin/env bash
如果[($#-ne 1)和&($#-ne 2)]]
然后
echo“使用率为$0[如果缺少,则为当前目录]”
其他的
REG_EXP=$1
DIR=${2:-.}
如果[!-d$DIR];然后
echo“目录[$DIR]不存在”;
出口1;
fi
查找“$DIR”-name“*.jar”-exec sh-c”
(测试-e{})
exitStatus=$?
如果[“$exitStatus”-等式0];然后#这样做是为了避免断开符号链接
jar-tf{}| grep-i-H--标签{}'$REG|u EXP'
fi
' \;
fi

您是否正在尝试解决依赖关系?i、 当你运行你的代码时,它找不到类,所以你想把它放在类路径上?是的,这正是我想做的。我想你问错了问题。我认为您想问的问题类似于“我正在尝试使用WASV6.1开发瘦客户机应用程序。我应该在JVM类路径中包含哪个jar来执行身份验证(可能是WSSubject)?”根据您实际尝试的操作,在信息中心搜索“t”
#!/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