2013-12-11 109 views
6

我有一個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作爲編程語言來實現子項目的遞歸通用打包?

回答

7

那麼,一旦我測試了一下,答案是非常直接的。首先,把本機打包項目 - 全球project/plugins.sbt

addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "0.6.4") 

然後,把配置的本地打包在build.sbt子項目。在上面的例子中,把下列masterserver/build.sbt

// Setup the packager 
packageArchetype.java_application 

// Enable JAR export for staging 
exportJars := true 

集所需的JAR文件將被投入到子項目的target目錄,在這個例子中爲masterserver/target/universal/stage/lib

子項目的配置的其餘部分可留在全球build.sbt,但我發現沒有辦法配置本地包裝器的方式。

+0

感謝您的自答。我發現它非常有幫助:) – opyate

+1

這個答案可能應該更新,以反映sbt-native-packager的1.x行中使用的sbt'AutoPlugin'工具。 – metasim

+0

確實,答案現在已經超過兩年了。不幸的是,自那以後,我們沒有更改或更新我們的工具鏈,所以我必須承認我沒有使用AutoPlugin的經驗。 :-( –