2012-03-19 9 views
6

Mam problemy z budowaniem i uruchomieniem projektu SBT.Scala SBT zbuduj projekt wielomodułowy dla działających słoików

  • Projekt "protokół" jest używany przez kilka modułów, w tym "demon".

  • Projekt "daemon" powinien być spakowany jako plik wykonywalny.

Jaki jest "właściwy" sposób na zrobienie tego?

Oto mój 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) 

Odpowiedz

7

Prawo sposobem, aby to zrobić jest użycie jednego z SBT wtyczek do produkcji słoików. Przetestowałem zarówno one-jar i assembly i oba mają wsparcie dla wykluczania bibliotek z twojego słoika. Możesz dodać ustawienia do poszczególnych projektów, aby tylko niektóre z nich tworzyły słoiki.

Osobiście używam zestawu, ale jak wskazuje this post, napotkasz problemy, jeśli nakładasz nazwy plików.

Edit:

Dla przykładu powyżej chcesz dodać następujące importu na górze:

import sbtassembly.Plugin._ 
import AssemblyKeys._ 

Można by zmodyfikować projekt wyglądać następująco:

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

Musisz również dodać do swojego numeru project/plugins.sbt (dla 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) 

Jeśli zdecydujesz się pójść ze Zgromadzeniem, prawdopodobnie będziesz musiał usunąć zduplikowane pliki. Oto przykład kodu zespołu służącego do wykluczania zduplikowanych plików log4j.properties w projekcie o nazwie "nazwa projektu". Powinno to zostać dodane jako część sekwencji "ustawień" dla projektu. Zwróć uwagę, że instrukcja 2. kolekcji jest podstawową implementacją i jest wymagana.

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

Dzięki, że działa dobrze. Musiałem także dodać wtyczkę do mojego plugins.sbt - możesz dodać to w swojej odpowiedzi, aby pomóc także innym. Zamknę to pytanie jutro. Wydaje mi się, że jedyną rzeczą, której naprawdę potrzebowałem było dodać ustawienie mainClass: = Some ("com.example.Main") do mojego projektu, o ile samodzielnie zarządzam zależnościami/klasą. - To było dość ukryte w dokumentacji, a może po prostu jestem ślepy :-) – Arve

Powiązane problemy