как установить основной класс В проекте 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:workexternalssbtbinsbtconfig.txt.
[info] Loading project definition from C:worktest_projectssbt_testproject
[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

PS.

Я в шоке, что после прочтения документации SBT и 15 подобных вопросов о StackOverflow я не мог запустить проект SBT. Это базовая функциональность, которая должна быть простой и понятной в первые 10 секунд просмотра веб-сайта SBT.

PS2.

и я хотел бы попросить сотрудников Typesafe улучшить документацию своего продукта вместо того, чтобы опускать вопросы людей, которые инвестируют значительное время при переходе на новую платформу.

6 68

6 ответов:

вам нужно поместить источник вашего приложения в 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.скала. Все основные классы в пределах этой области будут обнаружены автоматически. В противном случае вы получите ту же ошибку без основного класса не обнаружено. Ради Бога, SBT не говорит вам, что область по умолчанию не установлена. Это не имеет ничего общего с исходными папками по умолчанию и не по умолчанию, но только с SBT, не говоря ничего, что он не знает, что модуль для использования по умолчанию.

большой намек на typesafe: пожалуйста, добавьте вывод по умолчанию, как:

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

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

если у вас есть несколько главных методов в вашем проекте, вы можете добавить следующую строку в вашу сборку.sbt file:

val projectMainClass = "com.saeed.ApplicationMain"

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

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

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 строка в примере каждый раз. : - (