2013-12-11 73 views
6

我有一个sbt项目,具有大量的子项目和外部库依赖项。 build.sbt是这样的:如何使用sbt本地包装器与子项目(sbt 0.13)

val extlib1 = "xy.xxx" % "lib1" % "1.0+" 
val extlib2 = "xy.yyy" % "lib2" % "1.0+" 
val extlib3 = "xy.zzz" % "lib3" % "1.0+" 

lazy val core=project settings (
    name:="cor", 
    libraryDependencies++=Seq(extlib1) 
) 

lazy val servercore=project settings (
    name:="srvcore", 
    libraryDependencies++=Seq(extlib1,extlib2) 
) dependsOn(core) 

lazy val masterserver=project settings (
    name:="mastersrv", 
    mainClass:=Some("masterserver") 
) dependsOn(servercore) 

lazy val otherserver=project settings (
    name:="othersrv", 
    libraryDependencies++=Seq(extlib3), 
    mainClass:=Some("otherserver") 
) dependsOn(servercore) 

// Only for aggregating the builds of the subprojects 
lazy val root=project in file(".") settings(name:="proj") aggregate(
    core,servercore,masterserver,otherserver 
) 

因此,实际上该项目创建了几个方案(“masterserver”,“otherserver”),这取决于外部库和项目本身的子项目的一个子集。

我想要的是一套完整的启动主服务器或其他服务器所需的JAR,每个分开。所以,我想要例如含

mastersrv.jar 
srvcore.jar (needed by mastersrv.jar) 
cor.jar  (needed by srvcore.jar) 
lib1.jar  (needed by mastersrv and srvcore) 
lib2.jar  (needed by srvcore) 
<whatever>.jar (further libs needed by lib1 or lib2) 

,并包含类似内容的otherserver/target/<whatever>masterserver/target/<whatever>(那就必须添加lib3.jar也,如由othersrv.jar需要。

那怎么办?我可以与本地打包执行此?发行stage根项目不执行任何操作(因为没有mailClass?)。发行masterserver/state给出错误信息

> masterserver/stage 
[error] No such setting/task 
[error] masterserver/stage 
[error]     ^

我万亩st承认我没有从本地包装器插件文档中得到真正的线索。我如何存档我想要的东西?

编辑:当然,我没有绑定到目录的东西。如果我在主目录target中收到多个ZIP文件,它也是。我只想在一个位置拥有一个子项目的所有依赖关系。

编辑2:好的,我了解到Play!框架正是我想要的。它使用sbt本地包装器。如何在非Play的sbt处理项目中使用Java作为编程语言来实现子项目的递归通用打包?

回答

7

那么,一旦我测试了一下,答案是非常直接的。首先,把本机打包项目 - 全球project/plugins.sbt

addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "0.6.4") 

然后,把配置的本地打包在build.sbt子项目。在上面的例子中,把下列masterserver/build.sbt

// Setup the packager 
packageArchetype.java_application 

// Enable JAR export for staging 
exportJars := true 

集所需的JAR文件将被投入到子项目的target目录,在这个例子中为masterserver/target/universal/stage/lib

子项目的配置的其余部分可留在全球build.sbt,但我发现没有办法配置本地包装器的方式。

+0

感谢您的自答。我发现它非常有帮助:) – opyate

+1

这个答案可能应该更新,以反映sbt-native-packager的1.x行中使用的sbt'AutoPlugin'工具。 – metasim

+0

确实,答案现在已经超过两年了。不幸的是,自那以后,我们没有更改或更新我们的工具链,所以我必须承认我没有使用AutoPlugin的经验。 :-( –