2009-04-17 4 views

답변

16

뭔가 같은 :

find . -name '*.jar' | while read jarfile; do if jar tf "$jarfile" | grep org/jboss/Main; then echo "$jarfile"; fi; done 

이 같은 것을 마무리 할 수 ​​

jarscan() { 
    pattern=$(echo $1 | tr . /) 
    find . -name '*.jar' | while read jarfile; do if jar tf "$jarfile" | grep "$pattern"; then echo "$jarfile"; fi; done 
} 

을 그리고 jarscan org.jboss.Main 현재 디렉토리 아래에있는 모든 jar 파일에서 클래스를 검색합니다

+3

'jar'대신 'unzip -l'을 사용하면 매우 빠르게 실행됩니다. 'jar'는 'unzip -l'을 실행하면 72 초에서 4 초가 걸립니다. –

+0

정확히 말하면 여기에 왔습니다. +1 –

+0

어떤 항아리에서 특정 클래스를 찾을 수 있는지 알고 싶다면 보통 cd ~/.m2/repository와 같은 작업을 수행합니다. grep -r -H "classname"*. – extraneon

1

이제이 질문에 대답하는 것이 우리를 위해 만든 간단한 쉘 명령입니다.

for jarFile in $(
    ls -R | 
    awk ' 
     match($0, ".*:") { 
      folder=$0 
     } 
     ! match($0, ".*:") { 
      print folder$0 
     }' | 
     grep "\.jar" | 
     sed -e "s/:/\//g" 
); 
do 
    unzip -l $jarFile; 
done | 
awk ' 
    match($0, "Archive.*") { 
     jar=$0 
    } 
    ! match($0, "Archive.*") { 
     print jar" : "$0 
    }' | 
grep org.jboss.Main 
2

결과가 필요한 경우 agentransack http://www.mythicsoft.com/agentransack/을 설치하고 포함 된 텍스트 검색을 수행 할 수 있습니다. Agentransack은 jar 파일과 zip 파일을 검색합니다.

1

몇 년 전에 이런 문제를 해결하기 위해 유틸리티 classfind을 작성했습니다. 클래스 경로가 .jar 세트를 가리 키도록 설정하면 classfind가 특정 클래스를 찾을 항아리를 알려줍니다.

example% classfind -c Document 
/usr/java/j2sdk1.4.0/jre/lib/rt.jar -> org.w3c.dom.Document 
/usr/java/j2sdk1.4.0/jre/lib/rt.jar -> javax.swing.text.Document 
4

하지 직접 질문에 대답,하지만 어쩌면이 문제를 해결할 수 : 특정 클래스가 코드에 간단한 줄을 추가하여로드 된 위치 (예 : jar 파일)을 인쇄 할 수 있습니다

System.err.println(YourClass.class.getProtectionDomain().getCodeSource()); 

그러면 어디서 왔는지 알 수 있습니다.

3

도구 은 매우 유용합니다.

두 개의 패널이있는 GUI 창을 엽니 다. 디렉토리를 선택하면 도구가 해당 디렉토리의 모든 JAR 파일을 검색 한 다음 특정 클래스를 검색 할 수 있습니다. 그런 다음 아래쪽 패널에 모든 스캔 된 JAR 파일의 해당 클래스에 대한 히트 목록이 표시됩니다.

+0

이 도구의 새로운 URL : https://github.com/javalite/jar-explorer – ipolevoy

1

Java 도구 JarScan을 살펴볼 수도 있습니다.

클래스 이름 및 패키지별로 검색 할 수 있습니다.

Total Commander를 사용할 수없고 Java 만 실행할 수 있으면 많은 도움이됩니다.

1
#! /bin/sh 

path=$1 
segment=$2 

if [ -z "$path" ] || [ -z "$segment" ] 
then 
    echo "Usage: $0 <path> <segment>" 
    exit 
fi 

for jar in $path/*.jar ; do echo " *** $jar *** " ; jar tf $jar| grep --color=always $segment; done; 
관련 문제