[英]How to use object/type from one subproject in another in multi-project build in SBT?
我有以下多项目文件夹结构:
/ComponentA/ComponentA.scala
/ComponentA/build.sbt
/ComponentB/ComponentB.scala
/ComponentB/build.sbt
/project/Build.scala
main.scala
在根对象main.scala
,应该发生以下情况: ComponentA
返回ComponentB
读入并打印出来的String消息。
以下是文件的内容:
ComponentA
object ComponentA {
def main(args: Array[String]) {
var myMessage : String = "this message should be passed to ComponentB";
println("Message to forward: %s \n\n\n ".format(myMessage))
return myMessage;
}
}
以componentB
object ComponentB {
def main(args: Array[String]) {
println("\n\n\n Inside ComponentB! \n\n\n ")
println("Message received: %s \n\n\n ".format(args(0)))
}
}
Build.scala
import sbt._
import Keys._
object RootBuild extends Build {
lazy val root = Project(id = "root", base = file("."))
.dependsOn(ComponentA, ComponentB)
lazy val ComponentA = Project(id = "ComponentA", base = file("ComponentA"))
lazy val ComponentB = Project(id = "ComponentB", base = file("ComponentB"))
.dependsOn(ComponentA)
}
main.scala
object ComponentB {
def main(args: Array[String]) {
println("\n\n\n Inside main! \n\n\n ")
// THIS SHOULD HAPPEN:
// ComponentB(ComponentA());
}
}
这可能与项目结构有关吗? 如果是这样,代码将如何用于main.scala
?
根项目中的以下build.sbt
应该允许您创建该项目结构。
lazy val ComponentA = project
lazy val ComponentB = project dependsOn ComponentA
lazy val root = project in file(".") dependsOn (ComponentA, ComponentB) aggregate (ComponentA, ComponentB)
您必须在组件对象中修复一些问题,以便进行编译,但项目的类路径应该没问题。
然而,它是一种常见的方法有根项目子模块的集合所以你的情况root
不应该有dependsOn
与另外一个项目ComponentAB
那会dependsOn ComponentB
(因此ComponentA
作为ComponentB
已经依赖于它)。
下面的代码应该非常谨慎,只是为了问题。
ComponentA / ComponentA.scala
object ComponentA {
def apply(): String = {
var myMessage = "this message should be passed to ComponentB"
println(s"Message to forward: $myMessage\n\n\n")
myMessage
}
}
以componentB / ComponentB.scala
object ComponentB {
def apply(msg: String) = {
println("\n\n\n Inside ComponentB! \n\n\n ")
println("Message received: $msg\n\n\n")
}
}
Main.scala
object MainObject {
def main(args: Array[String]) {
println("\n\n\n Inside main! \n\n\n ")
//ComponentB(ComponentA())
ComponentA()
}
}
使用这些文件,当您run
您应该获得以下输出:
[root]> run
[info] Running ComponentB
Inside main!
Message to forward: this message should be passed to ComponentB
[success] Total time: 0 s, completed Jan 20, 2014 9:59:32 PM
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.