我有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
答案 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
。