2012-03-19 4 views
6

У меня возникли проблемы с созданием и запуском проекта SBT.Scala SBT build multi module project to runnable jars

  • Проект «Протокол» используется несколькими модулями, включая «демон».

  • Проект «демона» должен быть упакован как исполняемый фляга.

Что такое «правильный» способ сделать это?

Вот мой 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-jar, так и assembly, и обе имеют поддержку для исключения библиотек из вашей банки. Вы можете добавить настройки к отдельным проектам, чтобы только некоторые из них создавали банки.

Я лично использую сборку, но, как указывает this post, вы столкнетесь с проблемами, если у вас есть совпадающие имена файлов.

Edit:

Для примера выше вы бы добавить следующий импорт в верхнем:

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, вам, вероятно, потребуется удалить дубликаты файлов. Ниже приведен пример кода сборки для исключения дубликатов файлов 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») в мой проект, если я сам управляю зависимостями/classpath. - Это было довольно скрыто в документации, или, может быть, я просто слепой :-) – Arve

Смежные вопросы