2016-11-30 17 views
3

我一直在使用sbt-assembly爲我的scala項目生成獨立的JAR文件。但是,我想減少我的JAR文件的大小(目前大約150MB,並且有明顯的改進空間)。sbt-assembly:生成一個最小的JAR文件

我用下面的命令列出的出品的JAR文件的內容:

jar tf <JAR file> 

這表明,有很多未在項目中使用的生成JAR文件中的類。我相信這些類會被包含在第三方JAR中。

問題

(a)是沒有辦法,我可以用它來指導SBT-組件產生最小的JAR文件不包括未在我的項目中使用的第三方類的選項? (b)我可以使用AssemblyStrategy手動指定需要排除哪些文件。這是一個合理的策略嗎?我有點擔心用這種方法JAR文件可能會拋出意想不到的ClassNotFound異常。

在此先感謝。

回答

2

這是不容易說什麼是在你的項目中使用什麼,什麼不是。如果在項目中包含依賴項,則可能會引入一些其他項。這些子依賴項也可能需要自己的依賴項等。

默認情況下,如果您在項目中包含某些依賴項,則您打算使用。依賴項的作者通常會做同樣的事情。因此,通常沒有太多的東西可以扔掉,這是有原因的。有幾個情況時,這是不正確的:

  • 依賴作者包括只會在某些環境中使用額外的依賴,而並不適用於你的項目
  • 您使用的是大型的依賴,當你實際上只需要其中一個庫/功能。

這裏也有一些反例:Scalatest不提供pegdown生成html測試報告,因爲你通常不需要它。但是如果您嘗試使用-h標誌來生成html,則可能需要它。

想象一下當您使用Apache Tika進行pdf解析時的情況。它包裝PDFBox進行解析。在這種情況下,您不需要臃腫的all other libraries解析MS文檔。要做的最好的事情不是通過sbt excludesbt-assembly規則手動排除文件,因爲存在風險,您得到它的錯誤並得到運行時類加載異常。相反,您需要直接使用PDFBox這樣的正確依賴關係。不幸的是,在很多情況下,這是一個大量的手動工作以找出您需要的所有依賴關係,因此您可以選擇:容易和胖的JAR,或者痛苦和精益。

有兩種方法來排除依賴:

  1. 排除傳遞依賴與exclude。請參閱文檔here
  2. 不要使用頂級依賴關係,並根據需要手動添加它的子依賴關係。
  3. 好的,再少一個有趣的選項:使用provided並確保庫複製到目標環境並位於類路徑中。如果你有很多使用相同庫的罐子,這有助於分享這些罐子。

你可以用這個插件可視化你的依賴關係樹:https://github.com/jrudolph/sbt-dependency-graph。當試圖找出你正在使用的東西以及你可以刪除的東西時,它非常有用。有人建議使用tattletaleloosejar等工具,但我沒有嘗試過。如果有人有與這些經驗,請分享。

+0

謝謝。我決定現在使用「提供」的方法。我還會檢出幫助可視化依賴關係圖的工具。 – jithinpt