Ответ 1
Вам нужно поставить источник приложения в src/main/scala/
, project/
для кода определения сборки.
Ребята, не могли бы вы объяснить, как настроить основной класс в проекте 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
Вам нужно поставить источник приложения в src/main/scala/
, project/
для кода определения сборки.
Попробуйте использовать объект и расширить его из приложения вместо использования класса
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
чтобы переключить область на 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 в проектах с несколькими модулями.....
Если у вас есть несколько основных методов в проекте, вы можете добавить следующую строку в файл 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"
У меня была такая же проблема: был режим, следующий за учебником на http://www.scala-sbt.org/0.13/docs/Hello.html, и, на мой взгляд, в качестве инструмента построения sbt
взаимодействие и сообщения об ошибках могут ввести в заблуждение новичку.
Оказалось, что спустя несколько часов царапины головы я пропустил кривую cd hello
в этом примере каждый раз.: - (
у вас 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