Sbt fat jar(不包括未使用的代码)

Sbt fat jar (which excludes unused code)

所以我一直在尝试用 scala 和 sbt 做一些 AWS lambda。其中一项建议是

Minimize your deployment package size to its runtime necessities. This will reduce the amount of time that it takes for your deployment package to be downloaded and unpacked ahead of invocation. For functions authored in Java or .NET Core, avoid uploading the entire AWS SDK library as part of your deployment package.

我一直在使用 sbt-assembly 为我的代码和依赖项创建 fat jar,但当我只使用大约 10% 的 aws-core 库时,sbt-assembly 似乎会打包所有库依赖项很多内容。想知道我是否可以做些什么来减少对我的代码中实际导入的内容(及其依赖项)的依赖项数量。

据我所知,没有直接和安全的方法可以选择性地在 sbt-compile 插件生成的 fat jar 中包含依赖项 类。

首先,您应该明白,sbt 插件只是提供在您的项目中调用方法所需的设置和jar 文件。这意味着依赖插件与预编译的 jar 文件一起带到您的项目中,该文件由您在构建设置中指定的版本决定(例如,plugins.sbt 在您的项目目录中)。

例如,当您指定要使用 sbt-assembly 时,sbt-assembly 的 jar 会从 this link 带到您的项目中(尽管它是在您使用最近的 sbt 时带到您的项目中的)默认版本)。

因此,至少您可以有两种选择来压缩您的 jar 文件。

从头开始编译jar文件

对于sbt-aws,提供了它的源代码on this link,因此您可以选择性地编译源代码以获得您的程序将要使用的类。

使用压缩jar文件的工具

有几种工具可以根据依赖关系压缩 jar 文件。最受欢迎的工具是 proguard;似乎有对 sbt 的 proguard 支持。

警告

another stack overflow answer 中所述,根据输入值和其他几个条件,从 jar 中选择性地选择一些 类 可能会导致程序崩溃。您说过只使用了 10% 的 jar 文件,但您无法确保您的项目所依赖的代码和库中是否需要其他 类。当你使用帮助你缩小jar文件的工具时,当程序是安全关键程序时要小心。