我在构建和运行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)
答案 0 :(得分:7)
正确的方法是使用其中一个sbt插件来生成jar。我已对one-jar和assembly进行了测试,并且都支持从您的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
})
}
}