Scala SBT为可运行的jar构建多模块项目

时间:2012-03-19 15:11:24

标签: scala sbt

我在构建和运行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)

1 个答案:

答案 0 :(得分:7)

正确的方法是使用其中一个sbt插件来生成jar。我已对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文件的汇编代码示例。这应该作为"设置的一部分添加"项目的顺序。请注意,第二个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
    })
  }
}