2009-11-19 57 views
12

我正在向javac傳遞非常大的類路徑來編譯java項目。如何在編譯java項目時找出實際使用的jar文件

我知道一些這些jar文件是不需要的。

有沒有簡單的方法找出哪些文件不需要?

+1

你會發現沒有人也涵蓋了運行時依賴關係。 – BalusC 2009-11-19 14:54:28

+0

您甚至不會爲其他依賴項找到一個簡單的依賴項。歡迎來到classpath地獄;) – 2009-11-19 15:03:55

+0

記錄:類依賴關係分析儀提供最詳細的輸出,一個很好的圖形用戶界面來檢查結果。然而,它很慢,記憶力很差。作爲構建作業的一部分,Jar分析器看起來更容易自動化,並生成大量有用的輸出。它也相當快。 – tomdee 2009-11-19 17:14:22

回答

10

您需要Class Dependency Analyzer工具。引用簡介:

此工具的目的是分析Java™類文件,以便了解有關這些類之間的依賴關係的更多信息。

確實,它不會捕獲運行時依賴關係 - 但是缺少運行詳盡的100%覆蓋測試套件,您永遠無法確定是否捕獲了所有運行時依賴關係。

如果你希望你應該使用CDA作爲第一通運行時依賴,然後做最終應用的詳盡的測試,以確保有哪些是隻能通過運行時依賴引用沒有jar文件。

+0

我可能會錯過一些東西,但我不明白這會給你一個無用的jar列表。 – 2009-11-19 14:42:47

+0

它會告訴你應用程序依賴哪些容器,其餘的則是無用的。 – sanity 2009-11-19 14:48:45

+1

正確 - 您可以將使用的jar與類路徑進行比較,但這是有風險的 - 在分析路徑時可能沒有使用過庫,但是必須使用此庫。 – 2009-11-19 14:49:12

8

我猜「刪除它們逐一檢查應用程序仍然編譯和作品」沒有預期的答案:)


(編輯:雖然這種方法上面建議可有點自動化,它仍然不知何故不好受,並必須有一個選擇,至少在編譯時依賴一些google搜索後,我發現Jar Analyzer這似乎在這個blog post解釋是這項工作一個很好的工具。

罐分析器掃描編譯依賴關係,這意味着它可以創建一個需要JAR文件的樹來編譯編譯這些JAR文件所需的JAR文件,等等。你會得到一個非常好的報告/圖表,顯示所有的JAR文件以及它們爲什麼在那裏。

你也可以看到沒有任何連接到你的代碼的JAR文件,刪除它們和他們的孩子。我在libs文件夾中發現的是,在編譯時我們的libs文件夾中的大約20%的JAR文件未被使用,並且這些是可能的JAR被刪除。

最大的缺點是,您沒有得到任何關於哪些JAR文件僅在運行時通過發現和反射來使用的暗示。這就是真正的工作開始的地方。

找出在運行時是否使用JAR文件的唯一方法是基本上把它拿出來,啓動你的應用程序並測試每個功能。如果您的應用程序規模適中,則執行100%迴歸測試需要幾個小時。所以在實踐中,我最終做了大量的猜測,快速和骯髒的測試,並且詢問了解哪些運行時依賴關係實際上正在使用中。

它看起來很容易使用:下載,解壓縮並在包含所有罐子的目錄上運行該工具。或使用提供的Ant任務。)

+0

我希望能少一點手工! – tomdee 2009-11-19 14:39:29

+0

你總是可以實現一些腳本。 – 2009-11-19 14:41:24

+0

然而,如果你想覆蓋運行時依賴關係,這也是最好的方法。 – BalusC 2009-11-19 14:56:03

2

Eclipse的最新版本將警告你在你的源代碼

+2

如果你確實是在java源代碼文件中的import語句 - eclipse的警告很舊,而且是相反的 - 他正在尋找classpath條目沒有使用。 – 2009-11-19 14:59:45

+1

這已經是Eclipse功能相當長的時間 – 2009-11-19 14:59:59

2

編譯器有一個-verbose選項未使用的進口,這是相當冗長。它通知每個被加載的類以及它從哪裏加載!

雖然它不太方便用戶,並且不提供高級分析,但我發現它對於調試類路徑衝突非常有用。這會告訴你使用的罐子(在grep的幫助下),而不是那些沒有使用的罐子。

4

你也有loosejar.jar,使您能夠在運行時找到你的項目的真正依賴的JAR!

+0

真棒和完美這是!日Thnx – N3Xg3N 2014-07-02 10:40:51

相關問題