如何在SBT 0.13项目中设置主类

exp*_*ert 75 scala sbt

你能解释一下如何在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
Run Code Online (Sandbox Code Playgroud)

我有project单个文件的子文件夹,Hi.scala其中包含以下代码

object Hi {
  def main(args: Array[String]) = println("Hi!")
}
Run Code Online (Sandbox Code Playgroud)

我可以通过调用编译它sbt compilesbt 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
Run Code Online (Sandbox Code Playgroud)

Jed*_*ith 46

你需要在把你的应用程序的源src/main/scala/,project/是构建定义代码.

  • 不同的问题,删除`autoScalaLibrary:= false`&`scalaHome:= some(file("/ Program Files(x86)/ scala /"))`行并设置`scalaVersion:="2.10.1"` (6认同)

Art*_*iev 23

尝试使用对象并从App扩展它而不是使用类

object Main extends App {
  println("Hello from main scala object")
}
Run Code Online (Sandbox Code Playgroud)

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


exp*_*ert 16

以下是如何指定主类

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

  • 实际上`mainClass:= Some("Hi")`也没关系,因为如果在更具体的范围内没有键的值,sbt将回退到更一般的范围. (4认同)
  • 如果你正在使用scala,它还期望``扩展App`的`Main`是一个`object`.我真的很傻,这让我感到有些困惑. (4认同)
  • 我的项目中还有多个主类,可运行的应用程序,但是我反复运行很长一段时间,预选非常有用.我把它放到我的buid.sbt文件中:mainClass in(Compile,run):= Some("my.home.z033.rngtest.RngTest1")..并且它工作得很好.缩写的变体:mainClass:= Some("my.home.z033.rngtest.RngTest1")对我不起作用(sbt 0.13.1) (2认同)

Mar*_*sen 6

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

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

将范围切换到moduleX,如在Built.scala中定义.将自动检测该范围​​内的所有主要类.否则你会得到同样的错误,没有检测到主类.看在上帝的意义上,SBT没有告诉你没有设置默认范围.它与默认源文件夹和非默认源文件夹无关,但只有SBT没有告诉任何它不知道默认使用哪个模块.

对类型安全的大提示:请添加默认输出,如:

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

在SBT结束时开始降低在多模块项目中使用SBT时的挫折感.....