Scala 运行子项目主类

Scala 运行子项目主类,scala,sbt,Scala,Sbt,我有一个builded.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 mainCla

我有一个
builded.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)
由于我一直在研究这个问题,我首先从
akka
切换到
api
项目,然后打开控制台。从那里,它无法找到
maslow
包,即使它肯定存在。之后,我进入
api
文件夹,运行
sbt控制台
,它很好地访问了前面提到的包。完成此操作后,
sbt从akka项目运行。为什么?


文件夹
api
通过
git-read-tree
拉入。它不应该有什么特别的地方。我使用的是
sbt0.13.5

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

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) := ...
  )

我认为在一个多项目中,建立一个全球性的生产线,如

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) := ...
  )

问题是这一行:
lazy val api=project in file(“api”)

从:

定义对另一个项目的依赖关系时,您提供了一个ProjectReference。在最简单的情况下,这是一个项目对象。(从技术上讲,存在一个隐式转换项目=>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

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

从:

定义对另一个项目的依赖关系时,您提供了一个ProjectReference。在最简单的情况下,这是一个项目对象。(从技术上讲,存在一个隐式转换项目=>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

没有,仍然找不到它。奇怪的是,如果我将项目名称从
api
更改为类似
apii
的其他名称,我会得到以下运行时异常:java.lang.RuntimeException:重叠输出目录:/Users/mark/dev/Maslow-Akka/api/target:ProjectRef(文件:/Users/mark/dev/Maslow-Akka/,api)ProjectRef(文件:/Users/mark/dev/Maslow-Akka/,apii)没有,还是找不到。奇怪的是,如果我将项目名称从
api
更改为类似
apii
的其他名称,我会得到以下运行时异常:java.lang.RuntimeException:重叠输出目录:/Users/mark/dev/Maslow-Akka/api/target:ProjectRef(文件:/Users/mark/dev/Maslow-Akka/,api)ProjectRef(文件:/Users/mark/dev/Maslow-Akka/,apii)