默認情況下,我的SBT構建的運行任務執行我的主類(在src/main/scala/
中自動找到)。自定義'運行'像項目的任務
如何爲項目添加新任務,該項目的行爲與運行任務類似,但在src/util/scala
中找到主類?該任務應該在類路徑上使用src/main/scala
運行util main方法。
我正在使用完整的多項目配置的SBT 0.12.4。
默認情況下,我的SBT構建的運行任務執行我的主類(在src/main/scala/
中自動找到)。自定義'運行'像項目的任務
如何爲項目添加新任務,該項目的行爲與運行任務類似,但在src/util/scala
中找到主類?該任務應該在類路徑上使用src/main/scala
運行util main方法。
我正在使用完整的多項目配置的SBT 0.12.4。
下面定義了一個新的配置,從src/util/scala
編譯來源和定義util:run
和util:run-main
從新配置中運行主類。編譯和運行時,類路徑中提供了src/main/scala
的編譯源代碼。
import sbt._
import Keys._
object MyBuild extends Build
{
// Define a new configuration named `util`.
// Extending `Compile` means the main classpath is available to `util`
lazy val Util = config("util").extend(Compile)
// Add the new configuration to the project.
// Add the new settings.
lazy val root = Project("root", file(".")).configs(Util).settings(utilSettings : _*)
// Add the basic source, compilation, and packaging settings
// as well as custom run methods.
lazy val utilSettings = inConfig(Util)(Defaults.configSettings ++ utilRunSettings)
// Settings that define `run` and `run-main` to use the
// classpath from the enclosing configuration.
// (The standard `run` methods use the `Runtime` configuration.
lazy val utilRunSettings = Seq(
run <<= Defaults.runTask(fullClasspath, mainClass in run, runner in run),
runMain <<= Defaults.runMainTask(fullClasspath, runner in run)
)
}
(WAS 0.13測試,但應該在0.12工作。)
我不認爲sbt會在src/util /中找到代碼,它應該放在src/main/scala,src/test/scala等中。您可能希望將實用程序類添加到某種「util」包,可能在src/main/com/example/util中,或者將它們放在一個子項目或依賴項目中,但sbt並非真正設計(afaik)能夠處理任意目錄結構。
至於設置多個主要方法,sbt運行,如果它在src/main/scala中找到多個主要方法,將允許您選擇要調用哪一個。
如果是在外部罐子,你可能需要:Configuring sbt project to include external Main methods in "sbt run"
我最常做的是運行sbt console
,然後只需要導入並直接從那裏調用的主要方法。例如:
sbt console
import com.example.Main
Main(new String[])
既然你個子項目,如果你的項目之一是「UTIL」,你應該能夠使用類似sbt util/run
運行在UTIL/src目錄/主/ Scala的一個主要方法。
如果您在一個項目中有多個主要方法,您還應該能夠使用sbt "util/run-main com.example.MainClass"
。
您也可以考慮SBT啓動腳本插件: https://github.com/sbt/sbt-start-script
每http://www.scala-sbt.org/release/docs/Howto/defaultpaths.html,您可以添加任何目錄你想要的任何範圍。我*想*我需要一個新的作用域,在源路徑上使用'main'和'util'目錄,並使用不同名稱的'run'任務。我只是不知道該怎麼做。 – Andy
從你的鏈接看來你可以配置你的項目引用myRandomDirectory/main/scala中的scala來源而不是src/main/scala,但我認爲這對你沒有幫助。有很多方法可以從sbt運行(多個)任務,並且我使用了我的答案中列出的一些機制。我不確定爲什麼將主類保存在util目錄中會有所作爲。 – Brian
我有一個主類以及我的大部分業務邏輯在'src/main/scala'中,並且'src/main/util'中有一些實用程序代碼。實用程序代碼與主代碼非常相關,所以它似乎並不保證它自己的子項目。該實用程序代碼有其自己的主類,不是測試用例代碼,它在通常的'src/test/scala'中掛起。 – Andy
這看起來不錯。有時間嘗試一下。 – Andy
到目前爲止,我的項目構建文件編譯,但'util:run'自動查找並從'src/main/scala'運行主類。 – Andy
我測試了粘貼的代碼,'util:run'只在'src/util/scala'中運行主類。也許你可以在獨立項目中驗證代碼段,然後發佈如何將它集成到你的構建中? –