如何在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 

PS。

我感到震惊的是,在阅读SBT的文档和StackOverflow的15个类似问题后,我无法运行SBT项目。 这是基本的function,它应该是头脑简单,清醒在SBT的网站前10秒。

PS2。

我想问Typesafe的员工,以改善他们的产品的文档,而不是降低投入大量时间在切换到新平台的人的问题。

您需要将您的应用程序的源文件放在src/main/scala/project/用于构build定义代码。

这里是如何指定主类

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

尝试使用一个对象,并从应用程序而不是使用类扩展它

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

因为你需要运行主要的方法既不主要的类

对于SBT(0.13)中的自定义模块,只需在SBT控制台上input:

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

按照Built.scala中的定义将范围切换到moduleX。 在该范围内的所有主要类将被自动检测。 否则,你会得到没有检测到主类的错误。 看在上帝的份上,SBT并没有告诉你默认的范围没有设定。 它与默认和非默认源文件夹没有任何关系,但是只有在SBT没有告诉它不知道默认使用哪个模块的情况下。

大提示types安全 :请添加一个默认的输出,如:

 [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和activator中使用run-main命令指定主类来运行:

 sbt "run-main com.saeed.ApplicationMain" 

要么

 activator "run-main com.saeed.ApplicationMain" 

我有同样的问题:模式遵循http://www.scala-sbt.org/0.13/docs/Hello.html教程,在我看来,作为一个构build工具;sbt的交互和错误消息可以相当误导新人。

事实certificate,后来几个小时的头部划伤,我错过了每个例子中关键的cd hello行。 🙁