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

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

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



답변

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

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


답변

유닉스

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 파일 을 스캔 하는 검색 엔진 을 사용하십시오 .


답변

얼마 전에, 나는 그것을 위해 프로그램을 썼습니다 : https://github.com/javalite/jar-explorer


답변

grep -l "classname" *.jar

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

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

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


답변

#!/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


답변

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

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


답변

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

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

}