2008-10-10 64 views
0

我即將繼承具有大量第三方依賴關係的相當大的Java企業項目。至少包括七十個JAR,其中一些似乎未被使用,例如我知道spring.jar沒有使用。如何在大型項目中清除依賴關係?

看來,多年來,由於各種開發人員已經涉及到代碼庫,他們都試用了新的月度類型庫。

如何去除掉這些?當然,理所當然,一些依賴關係有助於不必重新發明輪子。

我明顯對基於java的項目很感興趣,但我很歡迎各種語言的答案,人們認爲這些答案會有所幫助。

回答

4

就我個人而言,我認爲你必須從評估問題的嚴重程度開始。這將是相當痛苦的,但我會列出依賴關係的列表,並確定項目的哪些部分使用哪些部分。

然後,我會準確地確定每個實際使用的功能(在很多情況下,最終會有一個很大的第三方庫)。

一旦你有了這些信息,你至少會知道你在處理什麼。

我的下一步是查看所有隻在很小範圍內使用的依賴關係。檢查周圍可能會發現可以從其他庫中使用的可以消除較少使用的庫的內容。

我也想看看有沒有什麼小的東西可以重新編寫幷包含在您自己的代碼庫中。

最後,我會查看一下您的依賴關係及其競爭對手的供應商,看看最新版本是否包含更多功能,可以讓您省略其他幾個功能。

然後,你只是想知道是否高度依賴少數供應商,或更少依賴於很多供應商! ; o)

1

如果您有一組很好的自動化測試,並且您正在尋找刪除根本不使用的庫,那麼您可以使用試驗和錯誤。一次一個,刪除一個庫,並運行測試,看看是否一切仍然有效。如果沒有,就把它放回去。當然,如果你甚至無法建立一個圖書館,你可能需要它。

基本上,不管你怎麼做,我的想法是一次刪除一個,看看有什麼突破。如果沒有什麼突破,賠率是好的,你可以扔圖書館。如果問題很小(例如,您需要一個大型庫中的一個類的方法),則可以對其進行編碼。

如果您正在處理獨立應用程序,那麼可以給JVM一個-verbose:class選項以查看正在加載哪些類。這應該給你喜歡的消息:

[Opened C:\Program Files\Java\jre1.6.0_04\lib\rt.jar] 
[Loaded java.util.regex.Pattern$Single from C:\Program Files\Java\jre1.6.0_04\lib\rt.jar] 
1

我讀到關於使用儀器here的做法,從來沒有嘗試過,但聽起來很合理。

1

我們在delphi代碼庫上完成了這樣的練習。我們極大地簡化了我們的外部依賴關係。基本上,我們去了解它是這樣的:

  • 編目所有外部庫,並在那裏他們被使用的組件
  • 編目(使用文件搜索工具),以及什麼。
  • 刪除了我們未使用或不需要的所有內容(某些庫已用於不再需要的代碼中)。
  • 對我們所青睞的圖書館進行了排名,其依據是圖書館是否被積極開發,它提供的功能有多少,使用它的代碼移植到另一個我們已經使用的圖書館是多麼困難,等等。
  • 最後,我們通過將該功能移植到另一個庫中,反覆地移除列表上低庫的依賴關係。

然而,這是相當多的工作。

1

如果你採取「刪除東西,直到它不會編譯」的方法,你需要非常小心傳遞運行時依賴。如果有一個高質量的測試套件,它可以提供幫助,但是您肯定需要運行一個像Cobertura這樣的測試覆蓋工具,以確保足夠的代碼已經過測試,可以鍛鍊完整的依賴關係圖。

你在說多少代碼? Joeri建議的基於評論的方法坦率地說對我來說似乎是最好的;它具有使您至少表面熟悉系統所有部分的額外優勢。如果你只是繼承了一個大項目,那麼你應該花些時間去做。

0

如果您有針對此項目的完整迴歸測試套件,您只需運行迴歸套件,同時每次運行1個循環中的少量JAR。它並不快,但它很容易做到。

+0

只要說沒有全面的測試套件,就有一些測試,但沒有接近完成。所以這種方法顯然不會有太大的幫助。 – 2008-10-11 01:45:56