2010-08-16 2 views
25

Ваш любимый инструмент, плагин, скрипт, чтобы найти класс java в кучке файлов jar?Как найти файл jar, содержащий определение класса?

Очень часто я наследую код, который жалуется на класс, который не существует, и это просто потому, что файл jar не включен в путь к классам. Но, в каком файле jar (ы) есть класс? У меня может не быть JAR (поэтому я должен искать в Интернете), или добавление JAR в путь к классам может создать проблему с дублированием класса.

Я, очевидно, предпочел бы плагин eclipse, но я открыт для любого программного обеспечения, которое работает с Windows.

Я знаю ... Windows не мой выбор, но это то, с чем мне нужно работать.

Спасибо!

Luis

P.S. Спасибо за ответ. Изучив некоторые ответы, я понял, что должен лучше объяснить свой сценарий. У нас была библиотека загруженных или созданных JAR-файлов, но иногда класс был где-то в сети.

+0

большой вопрос. Я сталкиваюсь с этим все время. не уверен, почему он был закрыт как не по теме. weird – Tagar

ответ

5

Обычно я использую bash для этого: grep -lr "ClassName" . Фокус в том, что имена никак не закодированы. Вы можете открыть файл jar в текстовом редакторе, и вы увидите их. (Вы можете даже включить имя пакета в поисковый запрос.)

Я подозреваю, что есть и эквивалент окон.

+0

Да, но проблема в том, что трудно определить, содержит ли файл определение или использование класса. И, да, есть утилита grep, которую можно загрузить. Спасибо! – luiscolorado

+0

@luiscolorado Это никогда не давало мне ложных срабатываний. Я не знаю, вероятно, большая часть контента (включая ссылочные классы) каким-то образом закодирована. –

+0

Mmmmmhh ... К сожалению, я получил кучу ложных срабатываний. Или, может быть, это потому, что класс имеет одно и то же имя для нескольких пакетов. В любом случае, я дам ему еще один выстрел. Спасибо, Никита! – luiscolorado

0

Вы всегда можете добавить библиотеку Reference в свой проект в Eclipse, а затем в браузере пакетов, просто разверните пакеты в JAR-файле, пока не найдете нужный класс.

+0

Конечно! Хотя я искал что-то быстрее :) Я должен иметь в списке 20 файлов jar в этом проекте, и кто знает, сколько классов. – luiscolorado

+1

Для банок на пути построения просто используйте Ctrl-Shift-T, чтобы найти класс. –

+0

Еще не моя чашка чая, но посмотрим. – luiscolorado

0

@Nikita Рыбака: AstroGrep для Windows, является нашим другом: http://astrogrep.sourceforge.net/

+0

Мне понравился AstroGrep! Я нашел его дружественным по сравнению с версией командной строки. Однако у него та же проблема, что и любой grep (см. Мой комментарий к Никите Рыбаку). – luiscolorado

+0

True ... _but_ с помощью AstroGrep вы можете установить его для возврата +/- N строк. Так что это не самый лучший вариант, но он может работать. – NinjaCat

1

Очень часто я унаследовать код, говорящее о классе, который не существует, и это только потому, что файл банка не входит в путь к классам.

Если это не в пути к классу, то у вас, вероятно, вообще нет файла JAR. Поиск через встроенную функцию Eclipse Ctrl+Shift+T не поможет. Обычно вы можете использовать имя пакета для «угадывания», где вы можете получить JAR-файл из Интернета. Например. класс org.apache.commons.lang.XXX доступен по телефону http://commons.apache.org/lang.

Для неочевидных я сам использую http://grepcode.com, систему поиска исходного кода JAR.

+1

_Если это не в пути к классам, тогда у вас, вероятно, вообще нет файла JAR. Ну, это часто случалось со мной с jboss. Сотни внутренних библиотек, и вам часто требуется немного их для компиляции вашего кода. Спасибо за ссылку, это интересно. –

+0

@Nikita: В этом конкретном случае вы хотели бы обновить целевой сервер вашего динамического веб-проекта до JBoss. – BalusC

+0

Boo ... все еще недоступен через 8 лет! Я думаю, что Maven Repo должен предложить это ... у него есть все, что нужно ... «все», что нужно сделать, это поддерживать обновленный индекс Lucene, да, КАЖДЫЙ один класс во всех его .jars! –

1

использовать это:

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(); 
     } 
    } 
} 
10

В том же ключе, как ответ BalusC в (я не могу выразить свое мнение еще ни ссылка 2 URLs, нет репутации :(), вы можете найти банку благодаря этим 2 баночки искатель двигатели: - http://www.jarfinder.com/ - findjar

+1

jarfinder * IS * ваш друг. – Tom

+0

Веб-сайт переехал в: http://www.findjar.com/ –

2

Я написал программу для этого: https://github.com/javalite/jar-explorer Он также декомпилировать существующий байт-код, чтобы показать вам, интерфейсы, методы, супер-классы, покажет содержание других ресурсов - текст, изображения, html и т. д.

+0

спасибо! отличный инструмент !!! – DBQ

6

Я столкнулся с той же проблемой бесчисленное количество раз, поэтому я написал небольшой инструмент, чтобы найти их.

простой командной строки: findclass MyClass -classpath ...

Он ищет каталоги, банки, почтовый индекс, войну и файлы ухо для вашего класса. Я написал несколько лет назад и использую его все время. Я думал, что другие могут оказаться полезными, поэтому я загрузил github.

Это свободно доступен для скачивания: https://github.com/eurozulu/Findclass/tree/master/dist

Если вы хотите посмотреть на источник, это в том же месте: https://github.com/eurozulu/Findclass/tree/master

Если вам это нравится, просто дайте мне знать, чтобы дать мне, что теплое удобное чувство :)

+0

Я нашел ваш инструмент полезным. Спасибо! – ObviousChild

2

Я использую jarscan. Это исполняемый файл jar, который может рекурсивно искать всю структуру папок для банок, содержащих класс, который вы ищете. Он выполняет поиск по имени класса, имени пакета или регулярному выражению.

33

(Это усовершенствование по сценарию я должен был в предыдущих версиях ответа, как он производит гораздо более чистый выход по цене некоторые awk специальные/некрасиво цитирования.)

Я построил сценарий (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 a.b.c.d.Class [directoryTreeRoot or, if missing, current dir] 

или просто

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

Dot символы в полное имя класса будет интерпретироваться в смысле регулярного выражения из «любого символа» но это не очень важно, так как это утилита эвристики (вот почему она нечувствительна к регистру тоже BTW). Обычно я не беспокоюсь о полном имени класса и просто набираю его часть.

2

Grepj - утилита командной строки для поиска классов в файлах jar.

Вы можете запустить утилиту, как grepj package.Class my1.jar my2.war my3.ear

область поиска является

  • Классы в файле фляги
  • Классы в пределах вложенных артефактов, таких как банки внутри уха и военных файлов
  • WEB-INF/классы также выполняются.

Может быть предоставлено несколько банок, ухо, военных файлов.

-1

Просто хотел бы упомянуть здесь, что thirdparties можно найти какое-то конкретное имя файла в jarfinder Хотя это не прямо ответить на вопрос, но это не повредит :)

Надеется, что это помогает

+0

Это, по сути, однострочный ответ. Кроме того, ссылка, что она уже была предоставлена, и, по сути, является самым голосующим ответом. Ты был ниндзяд на три года * –

3

Простая команда.Вам не нужно использовать «while-do», используйте «& &», чтобы напечатать имя файла, если «grep» находит класс.

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

для й в $ (найти -name '* .jar.) сделать разархивировать -l $ х | grep WCCResponseImpl done

0

Я пробовал некоторые из этих команд 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 =~ /\Q-c/){ 
      $$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 =~ /\Q-c/){ 
       $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; 
} 
1

Самый лучший и простой способ - использовать декомпилятор JAD. И да, его ECLIPSE PLUGIN!

Download и сохраните плагин в любом месте на вашем компьютере.

Плагин содержит следующие файлы:

  1. температура папки
  2. jad.exe файл
  3. A * net.sf.jadclipse_3.3.0.jar * JAR плагин
  4. A Readme

Выполните следующие шаги :

  1. Скопируйте JAR плагин в папку плагинов затмений папку
  2. Открыть затмение. Перейти к окну >> Предпочтения >> Java >> JADClipse >> Путь к декомпилятору.
  3. Дайте путь jad.exe
  4. Restart Затмение

Теперь выбрать любой класс и нажмите F3.

Файл .class автоматически декомпилирует и отображает содержимое!

0

Недавно я создал инструмент для поиска классов, пакетов и библиотек. Вы можете попробовать http://javasearch.buggybread.com/. Нажмите на фреймворк, и он поможет вам найти информацию о зависимостях (jar, pom).

Смежные вопросы