gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:40:26 25 4
gpt4 key购买 nike

我一直在使用 sbt-assembly 为我的 scala 项目生成独立的 JAR 文件。但是,我想减小 JAR 文件的大小(它目前大约 150MB,那里肯定有改进的空间)。

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

jar tf <JAR file>

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

问题

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

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

提前致谢。

最佳答案

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

默认情况下,如果您在项目中包含一些依赖项,您 打算用 .依赖项的作者通常做同样的事情。因此,通常可以扔掉的东西并不多,它的存在是有原因的。有几种情况并非如此:

  • 依赖作者包括仅在某些设置中使用且不适用于您的项目的附加依赖项
  • 当您实际上只需要其库/功能之一时,您正在使用 super 依赖项。

  • 也有反例:Scalatest 不发货 pegdown用于生成 html 测试报告,因为您通常不需要它。但是如果您尝试使用 -h 可能需要它标志生成html。

    想象一下当您使用 Apache Tika 进行 pdf 解析时的情况。它包装 PDFBox 以进行解析。你不需要 all other libraries 的膨胀在那种情况下,解析 MS 文档。最好的办法是不要通过 sbt exclude 手动排除文件或 sbt-assembly规则,因为有一个 风险你弄错了并获取运行时类加载异常。相反,您需要直接使用正确的依赖项,如 PDFBox。不幸的是,这是一个 大量手工作业在许多情况下,要弄清楚您需要的所有依赖项,因此这是您的选择:简单而胖的 JAR,或痛苦而精益的 JAR。

    有两种方法可以排除依赖项:
  • 使用 exclude 排除传递依赖项.查看文档 here .
  • 不要使用顶级依赖项并根据需要手动添加其子依赖项。
  • 好吧,还有一个不那么有趣的选项:使用 provided并确保将库复制到您的目标环境并位于类路径上。如果您有许多使用相同库的 jar,这有助于共享它们。

  • 你可以使用这个插件可视化你的依赖树: https://github.com/jrudolph/sbt-dependency-graph .在尝试弄清楚您正在使用什么以及您可以删除什么时,它非常有用。有一些工具,如 tattletaleloosejar人们建议但我还没有尝试过。如果有人有这些经验,请分享。

    关于scala - sbt-assembly:生成最小的 JAR 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40898945/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com