我在SBT中有一个多项目构建配置,它由两个不相互依赖的不同模块组成.他们只是(碰巧)属于同一产品.
项目布局如下:
myLib + build.sbt + myProject_1 | + build.sbt | + src | + ... + myProject_2 | + build.sbt | + src | + ... + project + Build.scala
project/Build.scala包含常见设置,如下所示:
import sbt._ import Keys._ object ApplicationBuild extends Build { val appVersion = "1.0-SNAPSHOT" val defaultScalacOptions = Seq( "-unchecked", "-deprecation", "-feature", "-language:reflectiveCalls", "-language:implicitConversions", "-language:postfixOps", "-language:dynamics", "-language:higherKinds", "-language:existentials", "-language:experimental.macros", "-Xmax-classfile-name", "140") val defaultResolvers = Seq( "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/" ) val defaultLibraryDependencies = Seq( "org.specs2" %% "specs2" % "1.14" % "test", "org.slf4j" % "slf4j-nop" % "1.7.5" % "test" ) val defaultSettings = Defaults.defaultSettings ++ Seq( scalacOptions ++= defaultScalacOptions, resolvers ++= defaultResolvers, libraryDependencies ++= defaultLibraryDependencies ) }
根构建文件build.sbt只需要将所有内容放在一起[我也尝试删除它..但是子项目不再被编译]:
lazy val myProject_1 = project.in(file("myProject_1")) lazy val myProject_2 = project.in(file("myProject_2"))
最后这里是myProject_1/build.sbt [我刚刚省略了myProject_2/build.sbt,因为它非常相似,并没有为主题提供任何附加值]:
name := "myProject_1" version := ApplicationBuild.appVersion ApplicationBuild.defaultSettings libraryDependencies ++= Seq( "commons-codec" % "commons-codec" % "1.8" )
项目编译成功...但是当我发出命令时sbt package
,会在根目标目录中生成一个空jar:
j3d@gonzo:~/myLib/$ ll target/scala-2.10 drwxrwxr-x 2 j3d j3d 4096 Dez 23 17:13 ./ drwxrwxr-x 5 j3d j3d 4096 Dez 23 17:13 ../ -rw-rw-r-- 1 j3d j3d 273 Dez 23 17:13 brix_2.10-0.1-SNAPSHOT.jar
我错过了什么吗?如何防止SBT生成这个空无用的jar?
我提出了一个解决办法有下列(重新)定义package
的build.sbt
:
Keys.`package` := { (Keys.`package` in (a, Compile)).value (Keys.`package` in (b, Compile)).value }
where a
(b
是)(子)模块.
lazy val a = project lazy val b = project
由于package
是Scala中的关键字,因此需要引用才能解析.
它还需要完全限定,因为默认情况下在构建文件中package
导入Keys._
和sbt._
导入.sbt
.
/Users/jacek/sandbox/so/multi-packageBin/build.sbt:5: error: reference to package is ambiguous; it is imported twice in the same scope by import Keys._ and import sbt._ `package` := { ^ [error] Type error in expression
另请注意,我使用的是SBT 0.13.2-SNAPSHOT(源自内置),因此请谨慎使用(但我怀疑它会对任何版本的SBT 0.13+产生影响).
[multi-packagebin]> */*:sbtVersion [info] 0.13.2-SNAPSHOT [multi-packagebin]> projects [info] In file:/Users/jacek/sandbox/so/multi-packageBin/ [info] a [info] b [info] * multi-packagebin [multi-packagebin]> package [info] Updating {file:/Users/jacek/sandbox/so/multi-packageBin/}a... [info] Updating {file:/Users/jacek/sandbox/so/multi-packageBin/}b... [info] Resolving org.fusesource.jansi#jansi;1.4 ... [info] Done updating. [info] Resolving org.scala-lang#scala-reflect;2.10.3 ... [info] Packaging /Users/jacek/sandbox/so/multi-packageBin/b/target/scala-2.10/b_2.10-0.1-SNAPSHOT.jar ... [info] Done packaging. [info] Resolving org.fusesource.jansi#jansi;1.4 ... [info] Done updating. [info] Packaging /Users/jacek/sandbox/so/multi-packageBin/a/target/scala-2.10/a_2.10-0.1-SNAPSHOT.jar ... [info] Done packaging. [success] Total time: 1 s, completed Feb 23, 2014 10:12:41 AM
这非常难以实现.以下一组选项似乎可以实现目标.这些选项的子集倾向于通过某些执行路径而不是其他执行路径来抑制根jar,因此如果要查找最小覆盖,请确保'sbt package'和'sbt publishLocal'都不会创建jar.我花了很长时间才找到这一套,我不愿意进一步迭代.
Keys.`package` := file(""), packageBin in Global := file(""), packagedArtifacts := Map(),
sbt:自2008年以来,简单的事情变得不可能.