我有一個sbt項目,具有大量的子項目和外部庫依賴項。 build.sbt
是這樣的:如何使用sbt本地包裝器與子項目(sbt 0.13)
val extlib1 = "xy.xxx" % "lib1" % "1.0+"
val extlib2 = "xy.yyy" % "lib2" % "1.0+"
val extlib3 = "xy.zzz" % "lib3" % "1.0+"
lazy val core=project settings (
name:="cor",
libraryDependencies++=Seq(extlib1)
)
lazy val servercore=project settings (
name:="srvcore",
libraryDependencies++=Seq(extlib1,extlib2)
) dependsOn(core)
lazy val masterserver=project settings (
name:="mastersrv",
mainClass:=Some("masterserver")
) dependsOn(servercore)
lazy val otherserver=project settings (
name:="othersrv",
libraryDependencies++=Seq(extlib3),
mainClass:=Some("otherserver")
) dependsOn(servercore)
// Only for aggregating the builds of the subprojects
lazy val root=project in file(".") settings(name:="proj") aggregate(
core,servercore,masterserver,otherserver
)
因此,實際上該項目創建了幾個方案(「masterserver」,「otherserver」),這取決於外部庫和項目本身的子項目的一個子集。
我想要的是一套完整的啓動主服務器或其他服務器所需的JAR,每個分開。所以,我想要例如含
mastersrv.jar
srvcore.jar (needed by mastersrv.jar)
cor.jar (needed by srvcore.jar)
lib1.jar (needed by mastersrv and srvcore)
lib2.jar (needed by srvcore)
<whatever>.jar (further libs needed by lib1 or lib2)
,幷包含類似內容的otherserver/target/<whatever>
masterserver/target/<whatever>
(那就必須添加lib3.jar
也,如由othersrv.jar
需要。
那怎麼辦?我可以與本地打包執行此?發行stage
根項目不執行任何操作(因爲沒有mailClass
?)。發行masterserver/state
給出錯誤信息
> masterserver/stage
[error] No such setting/task
[error] masterserver/stage
[error] ^
我萬畝st承認我沒有從本地包裝器插件文檔中得到真正的線索。我如何存檔我想要的東西?
編輯:當然,我沒有綁定到目錄的東西。如果我在主目錄target
中收到多個ZIP文件,它也是。我只想在一個位置擁有一個子項目的所有依賴關係。
編輯2:好的,我瞭解到Play!框架正是我想要的。它使用sbt本地包裝器。如何在非Play的sbt處理項目中使用Java作爲編程語言來實現子項目的遞歸通用打包?
感謝您的自答。我發現它非常有幫助:) – opyate
這個答案可能應該更新,以反映sbt-native-packager的1.x行中使用的sbt'AutoPlugin'工具。 – metasim
確實,答案現在已經超過兩年了。不幸的是,自那以後,我們沒有更改或更新我們的工具鏈,所以我必須承認我沒有使用AutoPlugin的經驗。 :-( –