2012-03-19 11 views
6

SBTプロジェクトのビルドと実行に問題があります。Scala SBTは実行可能なjarにマルチモジュールプロジェクトを構築します

  • 「プロトコル」プロジェクトは「デーモン」を含む、いくつかのモジュールによって使用されます。

  • "daemon"プロジェクトは実行可能な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からライブラリを除外することができます。個々のプロジェクトに設定を追加して、そのうちのいくつかだけが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ファイルを除外するためのアセンブリコードの例を示します。これは、プロジェクトの「設定」シーケンスの一部として追加する必要があります。 2番目のcollect文は基本的な実装であり、必須であることに注意してください。

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

関連する問題