【问题标题】:Create uberjar using sbt-assembly with just the jars from a multiproject build仅使用来自多项目构建的 jar 使用 sbt-assembly 创建 uberjar
【发布时间】:2016-09-07 12:48:47
【问题描述】:

我有一个多项目构建,我正在使用 sbt-assembly 来创建胖罐子。我想创建两个罐子:一个罐子只有项目创建的罐子,然后另一个罐子只有依赖项。我似乎能够很好地创建依赖项 jar (assemblyPackageDependency),但我无法弄清楚如何使用 just 项目生成的 jar 创建一个 jar。有没有简单的方法可以做到这一点?

【问题讨论】:

  • 不完全确定您的设置是什么;你能用sbt package吗?
  • 所以 myproject 构建了 jars a 和 b。在它们之间,它们依赖于 jars x、y 和 z。我想要一个是 a 和 b uberjar'd 的罐子,另一个是 x,y,z uberjar'd 的罐子

标签: scala sbt sbt-assembly


【解决方案1】:
  • sbt package 只打包当前子项目。
  • sbt assemblyPackageDependency 仅包括依赖项。不包括标记为dependsOn 的项目。

assembly、assemblyPackageDependency 或assemblyPackageScala 是使用AssemblyOption 中定义的设置来创建各种包装配置的任务。一些相关选项如下所示:

AssemblyOption(assemblyDirectory: File,
  // include compiled class files from itself or subprojects
  includeBin: Boolean = true,
  includeScala: Boolean = true,
  // include class files from external dependencies
  includeDependency: Boolean = true,

使用下面显示的配置的汇编调用的变体将导致包含所有子项目的二进制文件

assemblyOption in assemblyPackage := {
    val ao = (assemblyOption in assembly).value
    ao.copy(includeBin = true, includeScala = false, includeDependency = false)
  },

但是,如果您想保留assembly,可以创建一个新任务assemblyPackage。来自主要build.sbt的片段

lazy val assemblyPackage = TaskKey[File]("assemblyPackage", "packages multi-project using sbt-assembly")

lazy val assemblyPackageSettings = Seq(
  // Required packaging configuartion
  assemblyOption in assemblyPackageDependency := {
    val ao = (assemblyOption in assemblyPackageDependency).value
    ao.copy(includeScala = false)
  },
  // Some boiler-plate settings to be copied to new task
  assembledMappings in assemblyPackage       := Assembly.assembledMappingsTask(assemblyPackage).value,
  assemblyPackage                            := Assembly.assemblyTask(assemblyPackage).value,
  test in assemblyPackage := (test in assembly).value,
  assembleArtifact in assemblyPackage := true,
  packageOptions in assemblyPackage      := (packageOptions in (Compile, packageBin)).value,
  assemblyOutputPath in assemblyPackage      := { (target in assembly).value / (assemblyJarName in assemblyPackage).value },
  assemblyJarName in assemblyPackage       := ((assemblyJarName in assemblyPackage)      or (assemblyDefaultJarName in assemblyPackage)).value,
  // Choice of jar name
  assemblyDefaultJarName in assemblyPackage      := { name.value + "-assemblyPackage-" + version.value + ".jar" },
  assemblyOption in assemblyPackage := {
    val ao = (assemblyOption in assembly).value
    ao.copy(includeScala = false, includeDependency = false)
  },
  assemblyPackage := Assembly.assemblyTask(assemblyPackage).value
)

// And use itas
lazy val misc = project.settings(commonSettings ++ assemblyPackageSettings)
  .dependsOn(common)

sbt assemblyPackage 将构建带有所有依赖子项目的*-assemblyPackage-*jar 文件。

【讨论】:

    猜你喜欢
    • 2018-11-18
    • 2016-04-13
    • 2016-10-01
    • 1970-01-01
    • 2015-03-11
    • 2014-03-18
    • 2013-09-28
    • 2014-12-04
    • 1970-01-01
    相关资源
    最近更新 更多