如何find包含类定义的jar文件?

什么是你最喜欢的工具,插件,脚本,在一堆jar文件中find一个java

我经常inheritance那些抱怨不存在的类的代码,这只是因为jar文件没有包含在classpath中。 但是,在哪个jar文件是类? 我可能没有JAR(所以我必须在线search),或者将JAR添加到类path中可能会创build重复的类定义问题。

我显然更喜欢一个Eclipse插件,但我打开任何与Windows一起工作的软件。

我知道… Windows不是我的select,但是这是我的工作。

谢谢!

路易斯

PS谢谢你的回答。 在回顾了一些回应后,我意识到我应该更好地解释我的情况。 我们有一个下载或创build的JAR文件库,但有时候这个类会在某个地方联机。

Solutions Collecting From Web of "如何find包含类定义的jar文件?"

(这是对以前版本答案的改进,因为它以某些awk特殊/丑陋的引用的价格产生更清晰的输出。)

我已经建立了一个脚本( findinjars ),就是findinjars

 #!/usr/bin/env bash if [[ ($# -ne 1) && ($# -ne 2) ]] then echo "usage is $0 <grep pattern to look for in 'jar tvf' output> [<top-of-dir-tree> or, if missing, current dir]" else THING_TO_LOOKFOR="$1" DIR=${2:-.} if [ ! -d $DIR ]; then echo "directory [$DIR] does not exist"; exit 1; fi find "$DIR" -iname \*.jar | while read f ; do (jar tf $f | awk '{print "'"$f"'" " " $0}' | grep -i "$THING_TO_LOOKFOR") ; done fi 

你可以用以下方法调用它:

 $findinjars abcdClass [directoryTreeRoot or, if missing, current dir] 

要不就

 $findinjars partOfClassName [directoryTreeRoot or, if missing, current dir] 

完全限定类名中的点字符将以“任何字符”的正则表达式解释,但这并不是什么大问题,因为这是一个启发式实用程序(这就是为什么它也不区分大小写)。 通常我不打扰完整的类名,只是输入它的一部分。

在BalusC的回答(我不能发表评论,也没有链接2个网址,没有声望:(),你可以找到一个罐子感谢这两个jar发现者引擎相同的线路: – http://www.jarfinder.com/ – findjar

我通常使用bash: grep -lr "ClassName" . 诀窍是名称不以任何方式编码。 你可以在文本编辑器中打开jar文件,你会看到它们。 (您甚至可以在搜索查询中包括包名。)

我怀疑,也有一些相同的窗口。

我无数次遇到同样的问题,所以我写了一个小工具来找到它们。

一个简单的命令行:findclass MyClass -classpath …

它为你的课程搜索目录,jar,zip,war和ear文件。 我几年前写下来并一直使用它。 我以为其他人可能会觉得它有用,所以我上传到github上。

它可以免费下载: https : //github.com/eurozulu/Findclass/tree/master/dist

如果你想看看来源,它是在同一个网站: https : //github.com/eurozulu/Findclass/tree/master

如果你喜欢它,只要让我知道给我那温暖舒适的感觉:)

一个更简单的命令。 如果'grep'找到类,则不必使用'while-do',使用'&&'打印文件名。

 find . -name '*.jar' -print0 | xargs -0 -I '{}' sh -c 'jar tf {} | grep Hello.class && echo {}' 

我经常继承那些抱怨不存在的类的代码,这只是因为jar文件没有包含在classpath中。

如果它不在classpath中,那么你可能根本没有JAR文件。 通过Eclipse内置的Ctrl+Shift+T函数搜索并不会有太大的帮助。 通常你可以使用包名称来“猜测”你可以从网上获得JAR文件的位置。 例如,可以在http://commons.apache.org/lang找&#x5230;org.apache.commons.lang.XXX类。

对于不明显的,我自己使用http://www.jarhoo.com,JAR搜索引擎(这是不幸的在那个时候!)&#x3002;

用这个:

 public class Main { private static final String SEARCH_PATH = "C:\\workspace\\RPLaunch"; private static String CLASS_FILE_TO_FIND = "javax.ejb.SessionBean"; private static List<String> foundIn = new LinkedList<String>(); /** * @param args the first argument is the path of the file to search in. The second may be the * class file to find. */ public static void main(String[] args) { File start; new Scanner(args[0]); if (args.length > 0) { start = new File(args[0]); if (args.length > 1) { CLASS_FILE_TO_FIND = args[1]; } } else { start = new File(SEARCH_PATH); } if (!CLASS_FILE_TO_FIND.endsWith(".class")) { CLASS_FILE_TO_FIND = CLASS_FILE_TO_FIND.replace('.', '/') + ".class"; } search(start); System.out.println("------RESULTS------"); for (String s : foundIn) { System.out.println(s); } } private static void search(File start) { try { final FileFilter filter = new FileFilter() { public boolean accept(File pathname) { return pathname.getName().endsWith(".jar") || pathname.isDirectory(); } }; for (File f : start.listFiles(filter)) { if (f.isDirectory()) { search(f); } else { searchJar(f); } } } catch (Exception e) { System.err.println("Error at: " + start.getPath() + " " + e.getMessage()); } } private static void searchJar(File f) { try { System.out.println("Searching: " + f.getPath()); JarFile jar = new JarFile(f); ZipEntry e = jar.getEntry(CLASS_FILE_TO_FIND); if (e == null) { e = jar.getJarEntry(CLASS_FILE_TO_FIND); } if (e != null) { foundIn.add(f.getPath()); } } catch (IOException e) { e.printStackTrace(); } } } 

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

for $ in $(find。-name'* .jar')做unzip -l $ x | grep WCCResponseImpl完成

最好也是最简单的方法是使用JAD反编译器。 是的,它是一个ECLIPSE插件

将插件下载并保存在机器上的任何位置。

该插件包含以下文件:

  1. 一个临时文件夹
  2. 一个jad.exe文件
  3. 一个* net.sf.jadclipse_3.3.0.jar * JAR插件
  4. 自述文件

执行以下步骤:

  1. 将JAR插件复制到eclipse文件夹的插件文件夹中
  2. 打开日食。 转到窗口>>首选项>> Java >> JADClipse >>反编译器的路径。
  3. 给出jad.exe的路径
  4. 重新启动Eclipse

现在选择任何班级,然后按F3。

.class文件将自动反编译并显示内容!

Grepj是一个命令行工具,可以在jar文件中搜索类。

你可以像grepj package.Class my1.jar my2.war my3.ear一样运行这个工具

搜索范围是

  • jar文件中的类
  • 嵌套的工件,如耳内的jar和war文件中的类
  • WEB-INF /类也被搜索。

可以提供多个jar,ear,war文件。

我已经写了一个这样的程序: https : //github.com/javalite/jar-explorer它也将反编译现有的字节码,以显示您的接口,方法,超类,将显示其他资源的内容 – 文本,图像,HTML等等

您可以随时在Eclipse中将引用库添加到您的项目中,然后在Package Browser中,只需展开JAR文件中的包,直到找到您正在查找的类。

@Nikita Rybak:AstroGrep for Windows是我们的朋友: http ://astrogrep.sourceforge.net/

我尝试了一些Unix命令,但由于各种原因而出错。 这是我写的一个Perl脚本。 它专门设计用于使用Cygwin版本的Perl在Cygwin上运行。

 #!/bin/perl # This program searches recursively for a given class in .jar files contained in or below # directories given as command-line arguments. See subroutine printUsageAndExit for details, # or just run it with -h command-line argument. # # It is specfically designed to run on Windows via Cygwin, with Cygwin's version of Perl, # though it could easily be modified to run elsewhere. use strict; use File::Find; use Getopt::Std; sub processCommandLineArguments (\$\@); sub checkCommandLineArguments; my $className; my @startingDirectories; &checkCommandLineArguments; &processCommandLineArguments (\$className, \@startingDirectories ); my %options; $options{wanted} = \&processFoundFile; $options{no_chdir} = 1; $options{follow} = 1; # So that $File::Find::fullname will be populated. $options{follow_skip} = 2; # So it won't die if it encounters the same thing twice. &find ( \%options, @startingDirectories ); # find comes from "use File::Find". sub processFoundFile{ # This routine is called by File::Find. # # $File::Find::dir is the current directory name, # $_ is the current filename within that directory # $File::Find::name is the complete pathname to the file. my $jarFileName = $_; return unless /\.jar$/; my $fullFileName = $File::Find::fullname; # set by File::Find only when $options{follow} == 1 # Windowize filename: $fullFileName = qx{cygpath --windows $fullFileName 2>&1}; chomp $fullFileName; $fullFileName = '"' . $fullFileName . '"'; my @results = qx{jar -tf $fullFileName 2>&1}; local $/ = "\r\n"; # So that this Unix-based Perl can read output from Windows based jar command. for my $result ( @results ) { chomp $result; if ( $result =~ /\b(\w+)\.((java)|(class))$/ ) { my $classNameFound = $1; if ($classNameFound eq $className) { print $jarFileName, "\n"; return; } } } } sub processCommandLineArguments (\$\@){ my $refClassName = shift; my $refStartingDirectories = shift; $$refClassName = ''; # parse @ARGV while (@ARGV){ my $arg = shift @ARGV; if ($arg =~ /\Qc/){ $$refClassName = shift @ARGV; }elsif ($arg =~ /\Q-directories/){ while ($ARGV[0] =~ m{^/(\w+/?)+\b}){ my $directory = shift @ARGV; die "Can't find $directory $!" if ! -e $directory; push @$refStartingDirectories, $directory; } } } die "Must give -c class_name argument $!" if $$refClassName eq ""; push @$refStartingDirectories, '.' if scalar (@$refStartingDirectories ) == 0; } sub checkCommandLineArguments { { # getopts butchers @ARGV, so have to use it on a local version. local @ARGV = @ARGV; our $opt_h; &getopts('hc'); # Have to specify all options given or getopts will die. &printUsageAndExit if $opt_h; } my $className; { # getopts butchers @ARGV, so have to use it on a local version. local @ARGV = @ARGV; while (@ARGV){ my $arg = shift @ARGV; if ($arg =~ /\Qc/){ $className = shift @ARGV; &printUsageAndExit if $className =~ /^\s*$/ ; return; } } } &printUsageAndExit; } sub printUsageAndExit { print "Usage:\n\n"; print "$0 -c class_name_to_search_for [ -directories startingDirectory1 startingDirectory2 ...]\n\n"; print "Example:\n\n"; print "findJarContainingClass.pl -c ApplicationMaster -directories /home/lylez/Hadoop/hadoop-2.x/hadoop-2.2.0/share/hadoop/yarn/sources /home/lylez/Hadoop/hadoop-2.x/hadoop-2.2.0/share/hadoop/yarn\n\n"; exit; } 

我最近创建了一个工具来搜索类,包和库。 你可以试试http://javasearch.buggybread.com/ 点击框架,它会帮助你找到依赖信息(jar,pom)。

只是想在这里提到的第三方可以在jarfinder中搜索一些特定的文件名虽然它不直接回答这个问题,但它不会伤害:)

希望这可以帮助