2012-03-19 86 views
6

我在構建和運行SBT項目時遇到問題。Scala SBT構建多模塊項目以運行罐子

  • 「協議」項目被幾個模塊使用,包括「守護進程」。

  • 「守護程序」項目應打包爲一個可執行的jar。

這樣做的「正確」方式是什麼?

這裏是我的Build.scala:

object MyBuild extends Build { 
lazy val buildSettings = Seq(
    organization := "com.example", 
    version  := "1.0-SNAPSHOT", 
    scalaVersion := "2.9.1" 
    ) 

lazy val root = Project(
    id = "MyProject", 
    base = file("."), 
    aggregate = Seq(protocol, daemon) 
    ) 

lazy val protocol = Project(
    id = "Protocol", 
    base = file("Protocol") 
    ) 

lazy val daemon = Project(
    id = "Daemon", 
    base = file("Daemon"), 
    dependencies = Seq(protocol) 
    ) 
// (plus more projects) 

回答

7

做到這一點,正確的方法是使用SBT插件之一用於生產罐。我已經測試了one-jarassembly,並且都支持從jar中排除庫。您可以將設置添加到單個項目中,以便只有其中一些會生成罐子。

我個人使用匯編,但如this post指出,如果您有重疊的文件名,您將遇到問題。

編輯:

對於你上面的例子,你會在上面添加以下的進口:

import sbtassembly.Plugin._ 
import AssemblyKeys._ 

你會修改項目看起來像這樣:

lazy val daemon = Project(
    id = "Daemon", 
    base = file("Daemon"), 
    dependencies = Seq(protocol), 
    settings = assemblySettings 
) 

您還需要將以下內容添加到您的project/plugins.sbt(對於sbt .11):

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.7.3") 

resolvers += Resolver.url("sbt-plugin-releases", 
    new URL("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases/"))(Resolver.ivyStylePatterns) 

如果您決定使用Assembly,則可能需要刪除重複的文件。下面是一個用於在名爲「projectName」的項目中排除重複log4j.properties文件的彙編代碼示例。這應該作爲項目「設置」順序的一部分添加。請注意,第二個收集語句是基礎實現,並且是必需的。

excludedFiles in assembly := { (bases: Seq[File]) => 
    bases.filterNot(_.getAbsolutePath.contains("projectName")) flatMap { base => 
    //Exclude all log4j.properties from other peoples jars 
    ((base * "*").get collect { 
     case f if f.getName.toLowerCase == "log4j.properties" => f 
    }) ++ 
    //Exclude the license and manifest from the exploded jars 
    ((base/"META-INF" * "*").get collect { 
     case f if f.getName.toLowerCase == "license" => f 
     case f if f.getName.toLowerCase == "manifest.mf" => f 
    }) 
    } 
} 
+0

謝謝,這工作正常。還必須在我的plugins.sbt中添加插件 - 您可以在您的答案中添加以幫助其他人。明天我會結束這個問題。看來我真正需要的唯一東西就是將設置mainClass:= Some(「com.example.Main」)添加到我的項目中,只要我自己管理依賴關係/類路徑。 - 這在文檔中很隱蔽,或者我只是瞎了:-) – Arve 2012-03-19 16:12:49

相關問題