SBT从子项目运行主方法

时间:2016-05-08 21:31:40

标签: scala sbt

我正在编写一个包含scala宏的项目。这就是我将项目组织成两个子项目“macroProj”和“coreProj”的原因。 “coreProj”依赖于“macroProj”,还包含运行我的代码的主要方法。

我的要求是,当我从根项目中执行sbt run时,main方法取自coreProj子项目。我搜索并找到了一个解决此问题的线程

sbt: run task on subproject

基于此,我的build.sbt看起来像

lazy val root = project.aggregate(coreProj,macroProj).dependsOn(coreProj,macroProj)

lazy val commonSettings = Seq(
    scalaVersion := "2.11.7",
    organization := "com.abhi"
)

lazy val coreProj = (project in file("core"))
    .dependsOn(macroProj)
    .settings(commonSettings : _*)
    .settings(
        mainClass in Compile := Some("demo.Usage")
    )

lazy val macroProj = (project in file("macro"))
    .settings(commonSettings : _*)
    .settings(libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value)

mainClass in Compile <<= (run in Compile in coreProj)

但是当我从根目录执行sbt run时。我收到错误

/Users/abhishek.srivastava/MyProjects/sbt-macro/built.sbt:19: error: type mismatch;
 found   : sbt.InputKey[Unit]
 required: sbt.Def.Initialize[sbt.Task[Option[String]]]
mainClass in Compile <<= (run in Compile in coreProj)
                                         ^
[error] Type error in expression

1 个答案:

答案 0 :(得分:4)

在sbt中,mainClass是一个将返回程序入口点的任务,如果有的话。

您要做的是让mainClass成为mainClasscoreProj的值。

你可以这样做:

mainClass in Compile := (mainClass in Compile in coreProj).value

这也可以通过

来实现
mainClass in Compile <<= mainClass in Compile in coreProj

但是,首选语法为(...).value since sbt 0.13.0