SBT assembly:你能在多项目构建中创建一个只有一个子项目的程序集 jar 吗?
SBT assembly : Can you create an assembly jar of just one sub project in Multi project build?
我想为子项目创建一个胖程序集 jar,而不必为其他项目或整个全局项目生成 jar。我该怎么做?
从 https://github.com/sbt/sbt-assembly 我看到我可以为每个子项目添加 Main Class 或 jar 的名称,但无法 运行 它。程序集 运行s 用于主项目,而不是子项目。
有类似的问题,但是那里的答案没有解决这个问题。
更多详情如下:
我有一个用于多项目构建的标准文件夹结构。
├── project
│ └── build.properties
│ └── plugins.sbt
├── build.sbt
├── bar
│ └── src
├── fizz
│ └── src
└── foo
└── src
我的 plugins.sbt 是:addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6")
我的build.sbt是
ThisBuild / name := "My main Project"
ThisBuild / version := "0.1"
ThisBuild / scalaVersion := "2.11.8"
//Modules/Projects
lazy val global = project
.in(file("."))
.settings(settings)
.disablePlugins(AssemblyPlugin)
.aggregate(
bar,
fizz,
foo
)
lazy val bar = project
.settings(
name := "Bar",
settings,
assemblySettings
)
lazy val fizz = project
.settings(
name := "Fizz",
settings,
assemblySettings
)
lazy val foo = project
.settings(
name := "Foo",
settings,
assemblySettings
)
.dependsOn(
fizz
)
lazy val compilerOptions = Seq(
"-encoding",
"utf8"
)
lazy val settings = Seq(
scalacOptions ++= compilerOptions
)
lazy val assemblySettings = Seq(
assemblyMergeStrategy in assembly := {
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}
)
如果我 运行 assembly
,在 Intellij 中的 sbt shell 它 运行s 程序集用于全局项目。现在,因为我已将 aggregate
添加到全局项目中,它还会为所有子项目生成单独的 jar。
但这需要很多时间,我只想生成一个 bar
的 Jar,它只会给我 Bar 的 fat jar。如果我只是 运行 在 Foo 上组装,它会为 Foo 创建一个包含 Fizz 但不包含 Bar 的 fat jar。如何做到这一点?
根据@LuisMiguelMejíaSuárez 在解决方案后的评论。
bar/assembly
所以<sum-module-name-as-in-build.sbt>/assembly
我想为子项目创建一个胖程序集 jar,而不必为其他项目或整个全局项目生成 jar。我该怎么做?
从 https://github.com/sbt/sbt-assembly 我看到我可以为每个子项目添加 Main Class 或 jar 的名称,但无法 运行 它。程序集 运行s 用于主项目,而不是子项目。
有类似的问题,但是那里的答案没有解决这个问题。
更多详情如下:
我有一个用于多项目构建的标准文件夹结构。
├── project
│ └── build.properties
│ └── plugins.sbt
├── build.sbt
├── bar
│ └── src
├── fizz
│ └── src
└── foo
└── src
我的 plugins.sbt 是:addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6")
我的build.sbt是
ThisBuild / name := "My main Project"
ThisBuild / version := "0.1"
ThisBuild / scalaVersion := "2.11.8"
//Modules/Projects
lazy val global = project
.in(file("."))
.settings(settings)
.disablePlugins(AssemblyPlugin)
.aggregate(
bar,
fizz,
foo
)
lazy val bar = project
.settings(
name := "Bar",
settings,
assemblySettings
)
lazy val fizz = project
.settings(
name := "Fizz",
settings,
assemblySettings
)
lazy val foo = project
.settings(
name := "Foo",
settings,
assemblySettings
)
.dependsOn(
fizz
)
lazy val compilerOptions = Seq(
"-encoding",
"utf8"
)
lazy val settings = Seq(
scalacOptions ++= compilerOptions
)
lazy val assemblySettings = Seq(
assemblyMergeStrategy in assembly := {
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}
)
如果我 运行 assembly
,在 Intellij 中的 sbt shell 它 运行s 程序集用于全局项目。现在,因为我已将 aggregate
添加到全局项目中,它还会为所有子项目生成单独的 jar。
但这需要很多时间,我只想生成一个 bar
的 Jar,它只会给我 Bar 的 fat jar。如果我只是 运行 在 Foo 上组装,它会为 Foo 创建一个包含 Fizz 但不包含 Bar 的 fat jar。如何做到这一点?
根据@LuisMiguelMejíaSuárez 在解决方案后的评论。
bar/assembly
所以<sum-module-name-as-in-build.sbt>/assembly