运维开发网

scala – 组装仅包含所提供的依赖项的jar

运维开发网 https://www.qedev.com 2020-07-30 13:17 出处:网络 作者:运维开发网整理
有没有办法在sbt中下载并打包所有提供的依赖项在一个jar中,我可以在启动时将其添加到应用程序的类路径中? 我正在使用sbt-assembly,但生成的jar对于我的口味来说太大了:16 Mb,包括Scala-lang,Akka和Spray.我计划构建大约10-15个小型独立服务,每个服务都是一个jar,并且不想在我创建新版本部署时继续将16 Mb文件上传到s3(目前是我的repo). 当我排除S
有没有办法在sbt中下载并打包所有提供的依赖项在一个jar中,我可以在启动时将其添加到应用程序的类路径中?

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

当我排除Scala语言和上面提到的其他罐子时,我的装配罐会下降到大约1 Mb.所以我想要实现的是有一种方法来提供只有提供的依赖项和scala语言的胖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时提供类路径上的那些.

我只是不想亲自手动管理这些普通的罐子.我想利用我现有的构建并使用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,assembly-package-scala,assembly-package-dependency

然后我将有三个罐子,一个用于我的服务,一个用于scala语言,一个用于依赖.

0

精彩评论

暂无评论...
验证码 换一张
取 消