[英]Library Dependencies bundled together to create jar file is not present in the jar file using sbt-assembly
[英]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 exclude
或sbt-assembly
規則手動排除文件,因為存在冒錯誤並獲得運行時類加載異常的風險 。 相反,您需要直接使用像PDFBox這樣的正確依賴。 不幸的是,在許多情況下,這是很多手動工作 ,以找出您需要的所有依賴項,因此這是您的選擇:簡單而肥胖的JAR,或者痛苦和精益。
有兩種方法可以排除依賴項:
exclude
排除傳遞依賴項。 請參閱此處的文檔。 provided
並確保庫被復制到目標環境並且在類路徑上。 如果您有許多使用相同庫的罐子,這有助於分享這些庫。 您可以使用以下插件可視化您的依賴關系樹: https : //github.com/jrudolph/sbt-dependency-graph 。 在嘗試找出您正在使用的內容以及可以刪除的內容時,它非常有用。 人們建議使用像tattletale和loosejar這樣的工具,但我還沒試過。 如果有人有經驗,請分享。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.