簡體   English   中英

如何在SBT中的多項目構建中使用另一個子項目中的對象/類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM