web-dev-qa-db-ja.com

SBT 0.13プロジェクトでメインクラスを設定する方法

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
74
expert

アプリケーションのソースをsrc/main/scala/に配置する必要があります。project/はビルド定義コード用です。

46

クラスを使用する代わりに、オブジェクトを使用して、Appから拡張してみてください

object Main extends App {
  println("Hello from main scala object")
}

メインメソッドもメインクラスも実行する必要がないため

23

メインクラスの指定方法は次のとおりです。

mainClass in (Compile,run) := Some("my.fully.qualified.MainClassName")

16
expert

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を使用している間のフラストレーションのレベルを下げ始めます。

6
Marvin.Hansen

プロジェクトに複数のメインメソッドがある場合、次の行を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"
3
Saeed Zarinfam

4つのオプションがあります

  1. あなたには1つのメインクラスがあります

    • sbt runとsbtがメインを見つけます
  2. メインクラスが2つ以上ある

    • sbt runとsbtは実行したいものを選択することを提案します。

Multiple main classes detected, select one to run:
[1] a.b.DummyMain1
[2] a.b.DummyMain2
Enter number:

  1. メインクラスを手動で設定する場合。

    mainClass in run := Some("a.b.DummyMain1")
    
  2. パラメータとしてメインクラスで実行できます

    sbt runMain a.b.DummyMain1
    
1
Sergii Shevchyk

私は同じ問題を抱えていました: http://www.scala-sbt.org/0.13/docs/Hello.html のチュートリアルに従い、ビルドツールとしてsbtの相互作用とエラーメッセージは、新規参入者にとって非常に誤解を招く可能性があります。

数時間後に頭をひっかいて、重大なcd hello毎回例の行。 :-(

1
conny

Mainクラスが別のプロジェクトにある場合は、build.sbt動作します:

addCommandAlias("run", "; project_folder/run")
0
Langdon