Scala sbt程序集:生成最小的JAR文件

Scala sbt程序集:生成最小的JAR文件,scala,jar,sbt,sbt-assembly,Scala,Jar,Sbt,Sbt Assembly,我一直在使用sbt assembly为我的scala项目生成独立的JAR文件。但是,我想减小我的JAR文件的大小(目前大约为150MB,而且肯定还有改进的余地) 我使用以下命令列出生成的JAR文件的内容: jar tf <JAR file> jar-tf 这表明在生成的JAR文件中有很多类没有在项目中使用。我相信这些类会作为第三方JAR的一部分包含进来 问题 (a) 我是否可以使用一个选项来指示sbt assembly生成一个最小的JAR文件,该文件不包括项目中未使用的第三方类

我一直在使用sbt assembly为我的scala项目生成独立的JAR文件。但是,我想减小我的JAR文件的大小(目前大约为150MB,而且肯定还有改进的余地)

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

jar tf <JAR file>
jar-tf
这表明在生成的JAR文件中有很多类没有在项目中使用。我相信这些类会作为第三方JAR的一部分包含进来

问题

(a) 我是否可以使用一个选项来指示sbt assembly生成一个最小的JAR文件,该文件不包括项目中未使用的第三方类

(b) 我可以使用AssemblyStrategy手动指定需要排除哪些文件。这是一个合理的策略吗?我有点担心,使用这种方法,JAR文件可能会抛出意外的ClassNotFound异常


提前感谢。

要说出项目中使用了什么和没有使用什么并不容易。如果您在项目中包含一个依赖项,它可能会引入一些其他依赖项。这些子依赖项也可能需要它们自己的依赖项等等

默认情况下,如果在项目中包含某些依赖项,则打算使用它。依赖项的作者通常做同样的事情。因此,通常你不能扔掉很多东西,这是有原因的。有两种情况并非如此:

  • Dependency author包括仅在某些设置中使用的、不适用于项目的其他依赖项
  • 当您实际上只需要它的一个库/功能时,您正在使用一个超级依赖项
还有一些反例:Scalatest不提供用于生成html测试报告的
pegdown
,因为您通常不需要它。但是,如果您尝试使用
-h
标志生成html,则可能需要它

想象一下使用ApacheTika进行pdf解析的情况。它包装PDFBox来进行解析。在解析MS文档的情况下,不需要大量的。最好不要通过sbt
exclude
sbt assembly
规则手动排除文件,因为存在出错的风险
和运行时类加载异常。相反,您需要直接使用正确的依赖项,如PDFBox。不幸的是,在许多情况下,这是一个大量的手工工作,以找出您需要的所有依赖关系,因此这是您的选择:简单而肥胖,或者痛苦而瘦身

有两种排除依赖项的方法:

  • 使用
    Exclude
    排除可传递依赖项。见文件
  • 不要使用顶级依赖项,而是根据需要手动添加其子依赖项
  • 好的,还有一个不太有趣的选项:使用
    提供的
    并确保库被复制到目标环境中,并且在类路径上。如果您有许多JAR使用相同的库,这有助于共享这些库

  • 您可以使用此插件可视化依赖关系树:。当你试图弄清楚你正在使用什么以及你可以删除什么时,这是非常有用的。有些人建议使用像和这样的工具,但我还没有试过。如果有人有这些方面的经验,请与我们分享。

    我们可能想看看的是树行者

    对于Java,有以下几点(我没有尝试/使用过):


    谢谢。我决定现在使用提供的基于的方法。我还将检查有助于可视化依赖关系图的工具。