수십 개의 JAR 파일에서 클래스를 찾으십니까?


249

많은 jar 파일에서 특정 클래스 이름을 어떻게 찾을 수 있습니까?

(클래스 이름을 참조하는 클래스가 아닌 실제 클래스 이름을 찾습니다.)


1
이 답변에 대해 잘 모르겠지만 많은 JAR 파일이있는 작업 프로젝트에서 사용되는 클래스를 볼 때 커서를 클래스 이름에 놓고 마우스 오른쪽 버튼을 클릭 한 다음 선언 열기 ( F3); 그런 다음 새 탭의 맨 위에 JAR 파일을 나열해야합니다.
앤드류

답변:


59

Eclipse는 그것을 할 수 있습니다. (임시) 프로젝트를 만들고 라이브러리를 프로젝트 클래스 경로에 넣으십시오. 그러면 수업을 쉽게 찾을 수 있습니다.

내 마음에 오는 또 다른 도구는 Java Decompiler입니다. 한 번에 많은 항아리를 열 수 있으며 수업을 찾는 데 도움이됩니다.


22
그리고 Ctrl + Shift + T의 도움으로
KrishPrabakar

408

유닉스

Linux의 다른 Unix 변형 인 Windows의 Git Bash 또는 Cygwin에서는 jar(또는 unzip -v) grepfind명령을 사용하십시오.

다음은 주어진 이름과 일치하는 모든 클래스 파일 목록입니다.

for i in *.jar; do jar -tvf "$i" | grep -Hsi ClassName && echo "$i"; done

검색하려는 Java 아카이브의 전체 목록을 알고 있으면 (기호) 링크를 사용하여 모두 동일한 디렉토리에 배치 할 수 있습니다.

또는 find(대소 문자 구분)을 사용 하여 주어진 클래스 이름을 포함하는 JAR 파일을 찾으십시오.

find path/to/libs -name '*.jar' -exec grep -Hls ClassName {} \;

예를 들어 다음을 포함하는 아카이브 이름을 찾으려면 다음을 수행하십시오 IdentityHashingStrategy.

$ find . -name '*.jar' -exec grep -Hsli IdentityHashingStrategy {} \;
./trove-3.0.3.jar

JAR이 시스템의 어느 곳에 나 있을 수 있고 locate명령을 사용할 수있는 경우 :

for i in $(locate "*.jar");
  do echo "$i"; jar -tvf "$i" | grep -Hsi ClassName;
done

구문 변형 :

find path/to/libs -name '*.jar' -print | \
  while read i; do jar -tvf "$i" | grep -Hsi ClassName && echo "$i"; done 

윈도우

명령 프롬프트를 열고 JAR 파일이 포함 된 디렉토리 (또는 상위 디렉토리)로 변경 한 후 다음을 수행하십시오.

for /R %G in (*.jar) do @jar -tvf "%G" | find "ClassName" > NUL && echo %G

작동 방식은 다음과 같습니다.

  1. for /R %G in (*.jar) do-재귀 적으로 디렉토리를 순회하는 모든 JAR 파일을 반복합니다. 에 파일 이름을 저장하십시오 %G.
  2. @jar -tvf "%G" |-Java Archive 명령을 실행하여 지정된 아카이브 내의 모든 파일 이름을 나열하고 결과를 표준 출력에 씁니다. 이 @기호는 명령 호출 인쇄를 억제합니다.
  3. find "ClassName" > NUL-주어진 클래스 이름에 대해 jar 명령의 출력에서 ​​파이프 된 표준 입력을 검색합니다. ERRORLEVEL일치하는 경우 (그렇지 않으면 0) 1로 설정 됩니다.
  4. && echo %G-iff ERRORLEVEL가 0이 아닌 경우 Java 아카이브 파일 이름을 표준 출력 (콘솔)에 씁니다.

편물

JAR 파일 을 스캔 하는 검색 엔진 을 사용하십시오 .


3
예 -l은 그것을 제공하지만 stdin에서 입력을 가져올 때별로 유용하지 않습니다.
George Armhold


27
grep -l "classname" *.jar

항아리의 이름을 알려줍니다

find . -name "*.jar" -exec jar -t -f {} \; | grep  "classname"

수업의 패키지를 제공합니다


5
그것은 *의 .jar 그렙 -lir "클래스 이름"이어야합니다
레너드 Saers

12
#!/bin/bash

pattern=$1
shift

for jar in $(find $* -type f -name "*.jar")
do
  match=`jar -tvf $jar | grep $pattern`
  if [ ! -z "$match" ]
  then
    echo "Found in: $jar"
    echo "$match"
  fi
done

대단해! jar가없는 시스템 (경로에 있지 않음)에서 사용해야했기 때문에로 대체 jar -tvf되었습니다 unzip -l.
ixe013

9

주어진 문자열과 일치하는 항아리를 찾으려면

find . -name \*.jar -exec grep -l YOUR_CLASSNAME {} \;


이것은 클래스 자체뿐만 아니라 클래스에 대한 참조도 찾습니다.
Trevor Robinson

8

나는이 문제를 만났을 때 유틸리티를 알지 못했기 때문에 다음과 같이 썼다.

public class Main {

    /**
     * 
     */
    private static String CLASS_FILE_TO_FIND =
            "class.to.find.Here";
    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) {
        if (!CLASS_FILE_TO_FIND.endsWith(".class")) {
            CLASS_FILE_TO_FIND = CLASS_FILE_TO_FIND.replace('.', '/') + ".class";
        }
        File start = new File(args[0]);
        if (args.length > 1) {
            CLASS_FILE_TO_FIND = args[1];
        }
        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());
                }
            } else {
                foundIn.add(f.getPath());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}


4

user1207523의 스크립트가 제대로 작동합니다. 다음은 간단한 확장 대신 find를 사용하여 jar 파일을 검색하여 검색하는 변형입니다.

#!/bin/bash
for i in `find . -name '*.jar'`; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done

4

나는 항상 Windows에서 이것을 사용했으며 그 예외는 훌륭하게 작동했습니다.

findstr /s /m /c:"package/classname" *.jar, where

findstr.exe는 Windows 및 매개 변수와 함께 표준으로 제공됩니다.

  • / s = 재귀 적으로
  • / m = 일치하는 경우 파일 이름 만 인쇄
  • / c = 리터럴 문자열 (이 경우 패키지 이름 + 클래스 이름은 '/'로 구분됨)

이것이 누군가를 돕기를 바랍니다.


3

를 사용하는 bash script솔루션 unzip (zipinfo). 에 테스트했습니다 Ubuntu 12.

#!/bin/bash

# ./jarwalker.sh "/a/Starting/Path" "aClassName"

IFS=$'\n'
jars=( $( find -P "$1" -type f -name "*.jar" ) )

for jar in ${jars[*]}
    do
        classes=( $( zipinfo -1 ${jar} | awk -F '/' '{print $NF}' | grep .class | awk -F '.' '{print $1}' ) )
        if [ ${#classes[*]} -ge 0 ]; then
            for class in ${classes[*]}
                do
                    if [ ${class} == "$2" ]; then
                        echo "Found in ${jar}"
                    fi
                done
        fi
    done

이 스크립트는 mingw 호환되지 않습니다
kisp

2

특정 디렉토리의 특정 디렉토리에서 모든 jar 파일을 검색하려면 다음을 수행하십시오.

ls *.jar | xargs grep -F MyClass

또는 더 간단하게

grep -F MyClass *.jar

출력은 다음과 같습니다.

Binary file foo.jar matches

-F 옵션은 고정 문자열 검색을 의미하므로 매우 빠르므로 각 grep 호출마다 정규식 엔진을로드하지 않습니다. 필요한 경우 항상 -F 옵션을 생략하고 정규 표현식을 사용할 수 있습니다.


2

나는이 새로운 길을 찾았다

bash $ ls -1  | xargs -i -t jar -tvf '{}'| grep Abstract
jar -tvf activation-1.1.jar
jar -tvf antisamy-1.4.3.jar
  2263 Thu Jan 13 21:38:10 IST 2011 org/owasp/validator/html/scan/AbstractAntiSamyScanner.class
...

따라서 jar 및 클래스가 발견되면 find 명령 HTH Someone을 사용하여 ls -1 * .jar 또는 xargs에 입력을 제공 할 수 있습니다.


감사합니다. 다음과 같이 개선했습니다. ls -1 * .jar | xargs -i -t jar -tvf '{}'| grep 초록
Jérôme B

2

ClassFinder는이 문제를 해결하도록 설계된 프로그램입니다. 디렉토리와 jar 파일을 통해 재귀 적으로 검색하여 패턴과 일치하는 클래스의 모든 인스턴스를 찾을 수 있습니다. 파이썬이 아닌 자바로 작성되었습니다. 사용하기 쉬운 멋진 GUI가 있습니다. 그리고 그것은 빨리 달린다. 이 릴리스는 실행 가능한 jar로 사전 컴파일되므로 소스에서 빌드 할 필요가 없습니다.

여기에서 다운로드하십시오 : ClassFinder 1.0




1

왜 여기서 스크립트가 실제로 효과가 없었는지 잘 모르겠습니다. 이것은 작동합니다 :

#!/bin/bash
for i in *.jar; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done

1

jar 파일을 찾는 스크립트 : find_jar.sh

IFS=$(echo -en "\n\b") # Set the field separator newline

for f in `find ${1} -iname *.jar`; do
  jar -tf ${f}| grep --color $2
  if [ $? == 0 ]; then
    echo -n "Match found: "
    echo -e "${f}\n"
  fi
done
unset IFS

사용법 : ./find_jar.sh <jar 파일을 포함하는 최상위 디렉토리> <찾을 클래스 이름>

이것은 여기에 주어진 대부분의 답변과 유사합니다. 그러나 grep이 무언가를 찾으면 파일 이름 만 출력합니다. grep 출력을 억제하려면 / dev / null로 리디렉션 할 수 있지만 grep의 출력을 보는 것도 선호하므로 부분 클래스 이름을 사용하고 표시된 출력 목록에서 올바른 이름을 알아낼 수 있습니다.

클래스 이름은 "String"과 같은 간단한 클래스 이름이거나 "java.lang.String"과 같은 정규화 된 이름 일 수 있습니다.


1

또 다른 도구를 추가하려면 ... 이것은 매우 간단하고 유용한 Windows 도구입니다. 간단한 exe 파일을 클릭하면 검색 할 디렉토리와 클래스 이름을 지정하면 해당 클래스가 포함 된 jar 파일을 찾을 수 있습니다. 예, 재귀입니다.

http://sourceforge.net/projects/jarfinder/


1

폴더 및 하위 폴더 묶음에서 클래스를 찾으려면 https://jarscan.com/

Usage: java -jar jarscan.jar [-help | /?]
                    [-dir directory name]
                    [-zip]
                    [-showProgress]
                    <-files | -class | -package>
                    <search string 1> [search string 2]
                    [search string n]

Help:
  -help or /?           Displays this message.

  -dir                  The directory to start searching
                        from default is "."

  -zip                  Also search Zip files

  -showProgress         Show a running count of files read in

  -files or -class      Search for a file or Java class
                        contained in some library.
                        i.e. HttpServlet

  -package              Search for a Java package
                        contained in some library.
                        i.e. javax.servlet.http

  search string         The file or package to
                        search for.
                        i.e. see examples above

예:

java -jar jarscan.jar -dir C:\Folder\To\Search -showProgress -class GenericServlet

0

약간의 쉘을 가진 jar로 가득 찬 디렉토리에서 클래스를 찾을 수 있습니다.

"FooBar"클래스를 찾고 있습니다 :

LIB_DIR=/some/dir/full/of/jarfiles
for jarfile in $(find $LIBDIR -name "*.jar"); do
   echo "--------$jarfile---------------"
   jar -tvf $jarfile | grep FooBar
done

0

위의 모든 것에 추가해야 할 한 가지 : jar 실행 파일을 사용할 수없는 경우 (JDK와 함께 제공되지만 JRE와 함께 제공되지 않는 경우) 압축 해제 (또는 WinZip 또는 기타)를 사용하여 동일한 작업을 수행 할 수 있습니다.


0

뻔뻔한 자체 프로모션이지만 내가 작성한 유틸리티를 사용해 볼 수 있습니다 : http://sourceforge.net/projects/zfind

가장 일반적인 아카이브 / 압축 파일 (jar, zip, tar, tar.gz 등)을 지원하며 다른 jar / zip 파인더와 달리 깊이가 나올 때까지 중첩 된 zip 파일 (zip 내의 zip, jar 내의 jar 등)을 지원합니다.


0

파티에 조금 늦었지만 그럼에도 불구하고 ...

JarBrowser 를 사용하여 특정 클래스가있는 jar을 찾습니다. 선택한 경로에서 모든 항아리의 내용을 탐색 할 수있는 GUI를 사용하기 쉽습니다.


0

다음 스크립트는 당신을 도울 것입니다

for file in *.jar
do
  # do something on "$file"
  echo "$file"
  /usr/local/jdk/bin/jar -tvf "$file" | grep '$CLASSNAME'
done

0

이것은 MinGW (windows bash environment) ~ gitbash에서 잘 작동합니다.

이 함수를 HOME 디렉토리의 .bashrc 파일에 넣으십시오.

# this function helps you to find a jar file for the class
function find_jar_of_class() {
  OLD_IFS=$IFS
  IFS=$'\n'
  jars=( $( find -type f -name "*.jar" ) )
  for i in ${jars[*]} ; do 
    if [ ! -z "$(jar -tvf "$i" | grep -Hsi $1)" ] ; then
      echo "$i"
    fi
   done 
  IFS=$OLD_IFS
}

0

Grepj 는 jar 파일 내에서 클래스를 검색하는 명령 줄 유틸리티입니다. 나는 유틸리티의 저자입니다.

당신은 같은 유틸리티를 실행할 수 있습니다 grepj package.Class my1.jar my2.war my3.ear

여러 병, 귀, 전쟁 파일을 제공 할 수 있습니다. 고급 사용법의 경우 find를 사용하여 검색 할 jar 목록을 제공하십시오.



0

Linux 환경에서 다음을 수행 할 수 있습니다.

$ find <base_dir> -name *.jar -print0 | xargs -0 -l jar tf | grep <name>

여기서 namebase_dir에 기반을 둔 디렉토리 계층에 분산 된 jar 내부에서 찾고있는 클래스 파일의 이름입니다 .


0

당신은 사용할 수 있습니다 locategrep:

locate jar | xargs grep 'my.class'

updatedb를 사용하기 전에 실행해야합니다 locate.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.