说我具有以下多项目结构:
my-project/
├── build.sbt
├── app1/
├── app2/
├── app3/
├── sharedA/
└── sharedB/
我使用sbt-assembly为 app 子项目创建胖的JAR。 shared 子项目只是库代码,因此我禁用了 AssemblyPlugin 。
我使用default root project语法,因此子项目得以汇总,而无需我全部列出。
name := "my-project"
lazy val app1 = (project in file("app1"))
.dependsOn(sharedA)
lazy val app2 = (project in file("app2"))
.dependsOn(sharedB)
lazy val app3 = (project in file("app3"))
.dependsOn(sharedA, sharedB)
lazy val sharedA = (project in file("sharedA"))
.disablePlugins(AssemblyPlugin)
lazy val sharedB = (project in file("sharedB"))
.disablePlugins(AssemblyPlugin)
当我运行sbt assembly
时,这通常可以正常工作:我得到了 app 的程序集jar,而没有了 shared 的程序集jar。但是,我也得到了一个不需要的 my-project-assembly.jar 。如何禁用此功能?
如果我从顶部禁用
name := "my-project"
disablePlugins(AssemblyPlugin)
...
然后,即使对于子项目,该插件也被完全禁用。
我知道我可以显式声明一个根项目,并且可行:
lazy val root = (project in file("."))
.aggregate(app1, app2, app3, sharedA, sharedB)
.disablePlugins(AssemblyPlugin)
...
但是,实际上,可能会有很多子项目,因此我想坚持使用默认根项目样式。
答案 0 :(得分:0)
如果您丢弃assemblyMergeStrategy
中的路径,我认为它将按照您的意愿运行。
assemblyMergeStrategy in assembly := {
case PathList("sharedA", xs @ _*) => MergeStrategy.discard
case PathList("sharedB", xs @ _*) => MergeStrategy.discard
...
}