Как установить основной класс в проекте 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

И у меня есть project подпапки с одним файлом Hi.scala который содержит следующий код

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

Ответ 1

Вам нужно поставить источник приложения в src/main/scala/, project/ для кода определения сборки.

Ответ 2

Попробуйте использовать объект и расширить его из приложения вместо использования класса

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

потому что для запуска основного метода не требуется основной класс

Ответ 3

Вот как указать основной класс

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

Ответ 4

Для настраиваемых модулей в SBT (0.13) просто введите на консоли SBT:

 project moduleX
 [info] Set current project to moduleX (in build file:/path/to/Projects/)
 >   run
 [info] Running main 

чтобы переключить область на moduleX, как определено в Built.scala. Все основные классы в этой области будут обнаружены автоматически. В противном случае вы получите ту же ошибку, что и основной класс не обнаружен. Ради Бога, SBT не говорит вам, что область по умолчанию не установлена. Он не имеет ничего общего с исходными папками по умолчанию и не по умолчанию, но только с SBT ничего не говорит о том, что он не знает, какой модуль использовать по умолчанию.

Большая подсказка для типов: ПОЖАЛУЙСТА добавьте вывод по умолчанию, например:

[info] Project module is not set. Please use ''project moduleX''  set scope 
or set in Built file (LinkToDocu)  

в конце SBT начинают понижать уровень разочарования при использовании SBT в проектах с несколькими модулями.....

Ответ 5

Если у вас есть несколько основных методов в проекте, вы можете добавить следующую строку в файл build.sbt:

val projectMainClass = "com.saeed.ApplicationMain"

mainClass in (Compile, run) := Some(projectMainClass)

Если вы хотите указать класс, который будет добавлен в манифест, когда ваше приложение будет упаковано в виде файла JAR, добавьте эту строку в файл build.sbt:

mainClass in (Compile, packageBin) := Some(projectMainClass)

Вы также можете указать основной класс, используя команду run-main в sbt и активаторе для запуска:

sbt "run-main com.saeed.ApplicationMain"

или

activator "run-main com.saeed.ApplicationMain"

Ответ 6

У меня была такая же проблема: был режим, следующий за учебником на http://www.scala-sbt.org/0.13/docs/Hello.html, и, на мой взгляд, в качестве инструмента построения sbt взаимодействие и сообщения об ошибках могут ввести в заблуждение новичку.

Оказалось, что спустя несколько часов царапины головы я пропустил кривую cd hello в этом примере каждый раз.: - (

Ответ 7

Есть 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