2011-11-10 21 views
6

我有一個有一百萬個罐子的項目(很好,很多)。他們通過maven找到我,我只使用一小部分功能。爲了清潔起見,我想知道我可以不用的罐子。通過代碼覆蓋率確定未使用的罐子?

我的第一個想法是使用代碼覆蓋工具運行該程序,然後找到觸摸的類。

有沒有人做過這個?還是有更聰明的伎倆來實現相同?

+0

從類路徑中逐個刪除jar在構建中斷時刪除最後一個e –

+2

@ratchet freak - 壞主意,除非構建包含完整的集成測試,否則不會檢測到間接運行時依賴關係。 –

+0

@ratchet怪胎 - 這可以工作,但這是我最後恢復的蠻力。 – RobAu

回答

4

您可以使用-verbose:class VM選項運行項目。這將打印所有加載類的加載類。使用一些智能解析app/grep/regexp將允許您將jar名稱篩選爲一組唯一的條目,並告訴您使用哪些條目。

我認爲這會更容易,因爲它會自動告訴你是否使用了一個類,如果是這樣,在哪個jar中。

當然,這個和代碼覆蓋的問題是,它可能會刪除一個僅在某些特殊情況下使用的jar,但是如果您刪除了一兩個,那麼編譯器會發出抱怨,發現的(大多沒有太複雜的)任務類是一罐

可能建議使用linux的時候。

java -verbose:class <your startup command here> | grep "\[Loaded" | grep -o "from .*\]" | cut -c 6- | sort | uniq

如果你不使用Linux,然後保存到一個文件,得到一臺linux機器並運行在linux上(或者使用某些東西在Windows上運行bash命令)

+0

謝謝,這可能是最簡單的方法。我想知道,更多的人可能會有這個問題,如果任何人已經有一些代碼來做到這一點..這是一個很好的練習,但爲什麼重新發明輪子.. – RobAu

+1

@RobAu增加了一個Linux的例子。不理想,但伎倆。 – Thirler

0

考慮使用已存在的工具,如Dependency FinderJDepend。與所有靜態分析工具一樣,反射或DI框架的使用可能會導致這種情況發生;我已經使用定製工具來使用這個和其他輸入來解決問題,儘管它仍然是靜態的。

對於完整的運行時使用信息,您可以使用Thirler的解決方案,儘管它是否完整可能取決於遵循哪些代碼路徑。

0

您可以使用Maven Dependency Plugin來分析依賴關係樹。它還會建議你下載/添加到你的項目的依賴項,因爲它們依賴於任何其他的罐子。

請運行mvn dependency:tree並查看您是否使用了幾個不需要的罐子。

+0

這是行不通的,因爲我需要動態行爲,而不是靜態分析。 – RobAu