运行子项目主类

时间:2015-06-18 18:46:41

标签: scala sbt

我有built.sbt引用子项目的主类作为自己的主类:

lazy val akka = (project in file("."))
  .aggregate(api)
  .dependsOn(api)
  .enablePlugins(JavaAppPackaging)

lazy val api = project in file("api")

scalaVersion := "2.11.6"

// This is referencing API code 
mainClass in (Compile, run) := Some("maslow.akka.cluster.node.ClusterNode")

artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) =>
  s"""${artifact.name}.${artifact.extension}"""
}

name in Universal := name.value

packageName in Universal := name.value

但是,每次运行sbt run时都会出现以下错误:

> run
[info] Updating {file:/Users/mark/dev/Maslow-Akka/}api...
[info] Resolving jline#jline;2.12.1 ...
[info] Done updating.
[info] Updating {file:/Users/mark/dev/Maslow-Akka/}akka...
[info] Resolving jline#jline;2.12.1 ...
[info] Done updating.
[info] Running maslow.akka.cluster.node.ClusterNode
[error] (run-main-0) java.lang.ClassNotFoundException: maslow.akka.cluster.node.ClusterNode
java.lang.ClassNotFoundException: maslow.akka.cluster.node.ClusterNode
    at java.lang.ClassLoader.findClass(ClassLoader.java:530)

由于我一直在研究这个问题,我首先从api切换到项目akka,然后打开控制台。从那里,它无法找到maslow包,即使它肯定存在。之后,我进入api文件夹并运行sbt console,它就可以正常访问上述包了。执行此操作后, akka 项目中的sbt run可以正常运行。为什么?

通过api提取文件夹git read-tree。关于它不应该有什么特别之处。我正在使用sbt 0.13.5

2 个答案:

答案 0 :(得分:1)

我认为在多项目中构建一个全局行,例如

mainClass in (Compile, run) := ...

只会被吞没而没有后果,因为它没有引用任何项目。

可能以下工作:

mainClass in (Compile, run) in ThisBuild := ...

或者您将其添加到根项目的设置中:

lazy val akka = (project in file("."))
  .aggregate(api)
  .dependsOn(api)
  .enablePlugins(JavaAppPackaging)
  .settings(
    mainClass in (Compile, run) := ...
  )

答案 1 :(得分:1)

问题在于这一行:lazy val api = project in file("api")

来自docs

  

在定义对另一个项目的依赖关系时,提供ProjectReference。在最简单的情况下,这是一个Project对象。 (从技术上讲,存在隐式转换Project => ProjectReference)这表示对同一构建中的项目的依赖。

这表示同一版本中的依赖项。相反,我需要的是使用RootProject,因为api是外部版本:

  

可以在与当前构建,git存储库或打包到jar中并可通过http / https访问的项目中的目录中声明项目的依赖关系。这些被称为外部构建和项目。您可以使用RootProject在外部构建中引用根项目:

为了解决这个问题,我将项目声明从build.sbt删除到project/Build.scala

import sbt._

object MyBuild extends Build {
  lazy val akka = Project("akka", file(".")).aggregate(api).dependsOn(api)
  lazy val api = RootProject(file("api"))
}

要说清楚,问题是我的api子项目是ProjectRef而不是RootProject