SBTプロジェクトでメインクラスを設定する方法を教えてください。バージョン0.13を使用しようとしています。
ディレクトリ構造は非常に単純です(SBTのドキュメントとは異なります)。ルートフォルダーには、次のコンテンツを持つbuild.sbt
があります
name := "sbt_test"
version := "1.0"
scalaVersion := "2.10.1-local"
autoScalaLibrary := false
scalaHome := Some(file("/Program Files (x86)/scala/"))
mainClass := Some("Hi")
libraryDependencies ++= Seq(
"org.scalatest" % "scalatest_2.10" % "2.0.M5b" % "test"
)
EclipseKeys.withSource := true
そして、次のコードを含む単一ファイルHi.scala
のサブフォルダーproject
があります
object Hi {
def main(args: Array[String]) = println("Hi!")
}
sbt compile
を呼び出すことでコンパイルできますが、sbt run
は戻ります
The system cannot find the file C:\work\externals\sbt\bin\sbtconfig.txt.
[info] Loading project definition from C:\work\test_projects\sbt_test\project
[info] Set current project to sbt_test (in build file:/C:/work/test_projects/sbt_test/)
Java.lang.RuntimeException: No main class detected.
at scala.sys.package$.error(package.scala:27)
[trace] Stack trace suppressed: run last compile:run for the full output.
[error] (compile:run) No main class detected.
[error] Total time: 0 s, completed Apr 8, 2013 6:14:41 PM
アプリケーションのソースをsrc/main/scala/
に配置する必要があります。project/
はビルド定義コード用です。
クラスを使用する代わりに、オブジェクトを使用して、Appから拡張してみてください
object Main extends App {
println("Hello from main scala object")
}
メインメソッドもメインクラスも実行する必要がないため
メインクラスの指定方法は次のとおりです。
mainClass in (Compile,run) := Some("my.fully.qualified.MainClassName")
SBT(0.13)のカスタムモジュールの場合は、SBTコンソールで入力するだけです。
project moduleX
[info] Set current project to moduleX (in build file:/path/to/Projects/)
> run
[info] Running main
built.scalaで定義されているように、スコープをmoduleXに切り替えます。そのスコープ内のすべてのメインクラスは自動的に検出されます。そうしないと、メインクラスが検出されないという同じエラーが発生します。神のために、SBTはデフォルトのスコープが設定されていないことを教えません。デフォルトとデフォルト以外のソースフォルダとは関係ありませんが、デフォルトで使用するモジュールがわからないことを何も伝えないSBTのみです。
タイプセーフへの大きなヒント:デフォルト出力を追加してください:
[info] Project module is not set. Please use ''project moduleX'' set scope
or set in Built file (LinkToDocu)
sBTの終わりに、マルチモジュールプロジェクトでSBTを使用している間のフラストレーションのレベルを下げ始めます。
プロジェクトに複数のメインメソッドがある場合、次の行をbuild.sbtファイルに追加できます。
val projectMainClass = "com.saeed.ApplicationMain"
mainClass in (Compile, run) := Some(projectMainClass)
アプリケーションがJARファイルとしてパッケージ化されるときにマニフェストに追加されるクラスを指定する場合は、次の行をbuild.sbtファイルに追加します。
mainClass in (Compile, packageBin) := Some(projectMainClass)
実行するsbtおよびactivateのrun-mainコマンドを使用してメインクラスを指定することもできます。
sbt "run-main com.saeed.ApplicationMain"
または
activator "run-main com.saeed.ApplicationMain"
あなたには1つのメインクラスがあります
sbt run
とsbtがメインを見つけますメインクラスが2つ以上ある
sbt run
とsbtは実行したいものを選択することを提案します。Multiple main classes detected, select one to run:
[1] a.b.DummyMain1
[2] a.b.DummyMain2
Enter number:
メインクラスを手動で設定する場合。
mainClass in run := Some("a.b.DummyMain1")
パラメータとしてメインクラスで実行できます
sbt runMain a.b.DummyMain1
私は同じ問題を抱えていました: http://www.scala-sbt.org/0.13/docs/Hello.html のチュートリアルに従い、ビルドツールとしてsbt
の相互作用とエラーメッセージは、新規参入者にとって非常に誤解を招く可能性があります。
数時間後に頭をひっかいて、重大なcd hello
毎回例の行。 :-(
Mainクラスが別のプロジェクトにある場合は、build.sbt
動作します:
addCommandAlias("run", "; project_folder/run")