2010-05-08 86 views
5

您如何確定框架的這種和那種功能需要哪些罐子?例如,爲了僅支持依賴注入,所有可用於Spring的jar都需要哪些jar?確定某個功能需要哪些最小罐子

+3

測試,測試,測試。 但通常如果框架說它需要所有的罐子,你最好提供所有的罐子,否則你是自己的。 – 2010-05-08 23:56:01

+1

Spring就是一個例子。幾乎所有的第三方依賴都在Maven POM中標記爲可選。我同意測試是這個「全部」,但這是一個很好的問題 - 我經常希望能夠在運行時知道哪些庫實際使用了。 我已經使用了Java時間本地編譯器 - 它記錄了所有使用的類和它們來自的罐子。您可以模擬類似於跟蹤加載的類的自定義類加載器並使用Class.getResource()來確定位置的東西。 – mdma 2010-05-09 00:08:29

回答

4

有一些工具可以通過靜態分析代碼找出實際在應用程序中使用哪些類來創建最小的JAR,然後創建一個僅包含一個新的JAR這些類。 (我記得使用Zelix班主任要做到這一點,但也有很多的替代品)

問題與使用這些工具對於像春天有個DI框架包括:

  • 現有的僅微量靜態依賴。如果你動態加載類,你必須特別告訴分析器每一個。 DI框架,特別是Spring充滿了動態加載,包括對應用程序代碼不透明的動態加載。

  • 現有的工具通過創建新的輸出JAR來工作,而不是告訴您哪個輸入JAR沒有被使用。如果您要從封閉源代碼庫創建縮減封裝的應用程序,重新打包JAR是可以的,但這通常是不理想的,並且可能會對某些開放源代碼許可證造成問題。當然,你不想用Spring來做這件事。

從理論上講,有人可以寫一個工具來幫助。實際上,該工具需要(例如)知道如何從註釋中表達的Spring配置,XML以及從高級配置(例如SpringSecurity執行此操作)在運行時創建的bean描述符中提取動態類依賴關係。這是一個很大的問題。即使如此,您仍然有一個問題,即由於JAR修剪過程中遺漏了必需的JAR,導致安裝平臺上的配線「小」更改可能會失敗。

在我看來,更切實可行的辦法是:

  • 如果你使用Maven /常春藤來管理你的依賴,看看依賴關係圖,去掉那些看起來不再需要依賴...並進行測試,測試,測試。
  • 手動去除看似未使用的JAR ......並測試,測試,測試。
  • 別擔心。中等程度的未使用的JAR cruft可能會爲部署和webapp啓動時間增加一到三分之一,但這通常並不重要。 (但是,如果它......見上面)
+1

[Proguard](http://proguard.sourceforge.net)是另一個可以做到這一點(和更多)的例子。 – BalusC 2010-05-09 00:54:14

+0

@BalusC - 無疑還有其他值得一提的例子。但不幸的是,他們並沒有真正解決這個問題。 – 2010-05-09 04:45:41

+0

我指的是第1段:)在你編輯實用的替代品之前,我完全同意(+1)。 – BalusC 2010-05-09 04:51:14

1

這就是爲什麼一些較老的Java項目最終擁有600個Jars和一個200MB的戰爭文件,對於10,000行應用程序。有一種痛苦,如果你不仔細管理它...

0

你應該真的問框架提供者或閱讀文檔。在某些情況下(動態加載),靜態分析需要的罐子可能不夠,有時候最終會出現過多的罐子。

我曾經爲某種「實用程序」庫做過一些ftp幫助程序。它依賴於一些apache ftp jar。如果你從來不使用庫中的ftp功能,你不需要ftp jar,但是對代碼的靜態分析可能會說你需要它。這是你應該記錄的東西。

相關問題