2017-02-10 58 views
1

我需要分析jar中不同的.class文件使用(引用)哪些類。我知道jdeps等效於Java 7

jdeps -v example.jar 

產生這個輸出。不幸的是,如果用戶只有JDK 1.7,我需要一個可行的解決方案。這怎麼可能實現?

+0

我想技術上你可以用'javap -v'或'-c'來做到這一點,但需要一個JDK8似乎是理智的選擇 – Aaron

+0

看看下面的線程的答案https://stackoverflow.com/questions/4326407/analyze-jar-dependencies-in-a-java-project – SubOptimal

+0

@Aaron該程序的用戶是我們公司的開發人員,它不使用Java 8.我無法對此做任何事情。 –

回答

2

我已經能夠通過javap -c和正則表達式過濾器獲得看似良好的結果。

我以前cygwin獲得我的結果,但你應該能夠做到這一點在任何環境下,所有你需要的是解壓,javap的工具,並執行正則表達式的工具。在當前的Windows版本中,powershell將提供這些功能。

下面的代碼將列出每種類別的JAR文件中引用的類:

mkdir workDir 
unzip yourJar.jar -d workDir 
shopt -s globstar 
for classFile in **/*.class; do 
    echo "Classes used in $classFile :" 
    javap -c "$classFile" | grep -Eo "([a-zA-Z0-9]+/)+[A-Z][a-zA-Z0-9]*" | sort -u 
    echo 
done 

你說你想在一個jar文件中引用的類,所以假設你不希望每個細節類這應該工作:

mkdir workDir 
unzip yourJar.jar -d workDir 
shopt -s globstar 
for classFile in **/*.class; do 
    javap -c "$classFile" | grep -Eo "([a-zA-Z0-9]+/)+[A-Z][a-zA-Z0-9]*" 
done | sort -u 

注意,這將錯過不遵守約定的類,例如這是在默認包或者其名稱不以大寫字母開頭定義。

您還將檢索合格名稱以L開頭的類:這表示數組,如果您只關心類名,則可能需要除去該L。還有其他類似的單字母修飾符,我不記得了。

+0

謝謝,這似乎工作。 –

+0

@JFMeier要小心,雖然我沒有廣泛地測試它,也沒有遵循java文件規範,我敢肯定它必須缺少至少一些角落案例 – Aaron

1

使用JD Java Decompiler(http://jd.benow.ca/)。

+0

我肯定會研究,如果它不被我們的公司網絡封鎖爲「流媒體/ MP3」;-) –

+0

我不知道爲什麼會這樣。 Wikepedia也提到了該網站。 https://en.wikipedia.org/wiki/Java_Decompiler。也許你可以讓你的網絡人員去研究它。 – Jool

+0

我不再問爲什麼有些網站被封鎖,有些網站不是... –

1

另一種解決方案是將JDK1.8放在可訪問的網絡驅動器上,並在那裏調用jdeps。即使當本地JDK爲1.7時,這也可以工作。