簡體   English   中英

sbt-assembly:生成一個最小的JAR文件

[英]sbt-assembly: Generate a minimal JAR file

我一直在使用sbt-assembly為我的scala項目生成獨立的JAR文件。 但是,我想減小我的JAR文件的大小(目前大約150MB,那里有改進的空間)。

我使用以下命令列出生成的JAR文件的內容:

jar tf <JAR file>

這表明生成的JAR文件中有許多類未在項目中使用。 我相信這些課程是第三方JAR的一部分。

問題

(a)是否有一個選項可用於指示sbt-assembly生成一個不包含我的項目中未使用的第三方類的最小JAR文件?

(b)我可以使用AssemblyStrategy手動指定需要排除哪些文件。 這是一個合理的策略嗎? 我有點擔心,使用這種方法,JAR文件最終可能會拋出意外的ClassNotFound異常。

提前致謝。

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

默認情況下,如果您在項目中包含一些依賴項,則打算使用它 依賴的作者通常做同樣的事情。 因此,通常沒有多少你可以扔掉,這是有原因的。 如果不是這樣,有幾種情況:

  • 依賴關系作者包括僅在某些設置中使用的附加依賴項,並且這些依賴項不適用於您的項目
  • 當您實際只需要其中一個庫/功能時,您正在使用大型依賴項。

還有相反的例子:Scalatest不會發布pegdown來生成html測試報告,因為你通常不需要它。 但是如果您嘗試使用-h標志來生成html,則可能需要它。

想象一下當您使用Apache Tika進行pdf解析時的情況。 它包裝PDFBox來進行解析。 在這種情況下,您不需要解析MS文檔的所有其他庫的膨脹。 最好的辦法是不要通過sbt excludesbt-assembly規則手動排除文件,因為存在冒錯誤並獲得運行時類加載異常的風險 相反,您需要直接使用像PDFBox這樣的正確依賴。 不幸的是在許多情況下,這是很多手動工作 ,以找出您需要的所有依賴項,因此這是您的選擇:簡單而肥胖的JAR,或者痛苦和精益。

有兩種方法可以排除依賴項:

  1. 使用exclude排除傳遞依賴項。 請參閱此處的文檔。
  2. 不要使用頂級依賴項並根據需要手動添加其子依賴項。
  3. 好的,另一個不那么有趣的選擇:使用provided並確保庫被復制到目標環境並且在類路徑上。 如果您有許多使用相同庫的罐子,這有助於分享這些庫。

您可以使用以下插件可視化您的依賴關系樹: https//github.com/jrudolph/sbt-dependency-graph 在嘗試找出您正在使用的內容以及可以刪除的內容時,它非常有用。 人們建議使用像tattletaleloosejar這樣的工具,但我還沒試過。 如果有人有經驗,請分享。

可能需要關注的是樹木工人

對於Java,有以下內容(我沒有嘗試/使用它):

http://proguard.sourceforge.net/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM