如何设置主类在SBT 0.13项目(how to set main class in SBT 0.1

2019-08-20 13:11发布

难道你们,请向我解释如何设置主类在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 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

Answer 1:

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



Answer 2:

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

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

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



Answer 3:

下面是如何指定主类

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



Answer 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降低挫折的水平.....



Answer 5:

如果你在你的项目中多个主要方法,你可以将下面的行添加到您的build.sbt文件:

val projectMainClass = "com.saeed.ApplicationMain"

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

如果你想指定将被添加到当应用程序被打包为一个JAR文件清单中的类,这行添加到您的build.sbt文件:

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

您还可以在SBT和激活运行使用运行主命令指定主类:

sbt "run-main com.saeed.ApplicationMain"

要么

activator "run-main com.saeed.ApplicationMain"


Answer 6:

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

原来,头部小时后刮伤,我错过了关键的cd hello的例子中,每个时间线。 :-(



Answer 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("abDummyMain1") 
  2. 你可以用主类作为参数运行

     sbt runMain abDummyMain1 


Answer 8:

如果主类是在不同的项目,然后通过设置以下命令build.sbt将工作:

addCommandAlias("run", "; project_folder/run")


文章来源: how to set main class in SBT 0.13 project
标签: scala sbt