2009-04-17 114 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

使用'unzip -l'代替'jar'使它運行非常快。 'jar'花了72秒,比'4'時用'unzip -l'運行 – 2009-04-17 12:19:27

+0

我來這裏說這個。 +1 – 2009-04-17 15:28:30

1

現在回答這個問題是一個簡單的shell命令,爲我們做了這個。

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 
1

幾年前,我寫了一個實用程序classfind來解決這樣的問題。將你的類路徑設置爲指向你的.jar集合,並且classfind會告訴你它將在哪個jar中找到一個特定的類。

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

工具JAR Explorer非常有用。

它彈出打開一個GUI窗口與兩個面板。您可以選擇一個目錄,該工具將掃描該目錄中的所有JAR文件,然後讓您搜索特定的類。下面的面板然後點亮所有掃描的JAR文件中該類的命中列表。

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; 
相關問題