使用sbt程序集仅使用多项目构建中的jar创建uberjar



我有一个多项目构建,我使用sbt汇编来创建胖罐子。我想创建两个jar:一个jar只包含项目创建的jar,另一个jar仅包含依赖项。我似乎能够很好地创建依赖项jar(assemblyPackageDependency),但我很难弄清楚如何使用创建一个jar,而只是项目生成的jar。有简单的方法吗?

  • sbt package仅封装当前子项目
  • CCD_ 2仅包括依赖项。标记为dependsOn的项目不包括在内

assemblyassemblyPackageDependencyassemblyPackageScala是利用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文件。

最新更新