gpt4 book ai didi

scala - 组装一个仅包含提供的依赖项的 jar

转载 作者:行者123 更新时间:2023-12-01 10:01:13 24 4
gpt4 key购买 nike

有没有一种方法可以将 sbt 中提供的所有依赖项下载并打包到一个 jar 中,我可以在启动应用程序时将其添加到应用程序的类路径中?

我正在使用 sbt-assembly,但生成的 jar 对我来说太大了:16 Mb,包括 Scala-lang、Akka 和 Spray。我计划构建大约 10-15 个小型独立服务,每个服务都作为一个 jar,并且不想在我创建新版本部署时继续将 16 Mb 文件上传到 s3(当前是我的 repo)。

当我排除 Scala 语言和上面提到的其他 jar 时,我的汇编 jar 下降到大约 1 Mb。所以我想要实现的是有一种方法来提供一个仅包含所提供的依赖项和 scala 语言的胖 jar,这样我就可以在启动它们时将其添加到我的服务的类路径中。

我可以从我的 ivy 缓存中获取每个库,手动部署它们并将它们添加到类路径中,但基本上我希望能够在我更改版本并上传它时构建一个新的组装 jar。

我想有一个单独的项目,另一个项目依赖,包含我提供的所有 jar,但是有更简单的方法吗?


根据要求进一步说明:

我更大的目标是自动部署到云服务器中。我首先使用 sbt-assembly 在本地构建,例如生成 service-a.jar、service-b.jar 等。然后我将这些同步到 s3,因此如果只更新 service-a.jar,则只有该文件会上传到s3。接下来我指示我的 ec2 服务器下载更改的文件并重新启动任何新服务。

当使用 sbt-assembly 时,我得到一个带有所有依赖项的胖 jar(就像 onejar)。然而,将该 jar 上传到 s3 需要很长时间,并且 16Mb 的这些文件中有 15Mb 只是常见的依赖项。所以我的想法是将所有这些共享依赖项放入一个很少更改的单独 jar 中,并在启动 java -cp "deps.jar;service-a.jar"org.myapp.StartApp

我只是不想自己手动管理那些常用的 jar。我想利用我现有的构建并使用 sbt/ivy 依赖管理系统为我下载正确的文件并准备一个我可以与我的独立服务分开分发的包。

到目前为止,我提出的所有解决方案似乎都过于复杂,尤其是当我仍然需要能够运行测试等时(所以在 sbt 构建文件中没有“提供”)。欢迎提出其他建议。

最佳答案

我在查看 sbt-assembly 插件的源代码时找到了答案:

lazy val assembly          = TaskKey[File]("assembly", "Builds a single-file deployable jar.")
lazy val packageScala = TaskKey[File]("assembly-package-scala", "Produces the scala artifact.")
lazy val packageDependency = TaskKey[File]("assembly-package-dependency", "Produces the dependency artifact.")

因此,使用以下配置 + 命令,我可以获得我需要的所有工件:

// Produces a jar without dependencies and scala language jar included
lazy val assemblyMicroService = assemblySettings ++
Seq(
assembleArtifact in packageScala := false,
assembleArtifact in packageDependency := false
)

然后依次运行命令:程序集,assembly-package-scala,assembly-package-dependency

然后我将拥有三个 jar,一个用于我的服务,一个用于 scala 语言,一个用于依赖项。

关于scala - 组装一个仅包含提供的依赖项的 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15856739/

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