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)