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

你们能给我解释一下 SBT 项目的主要课程是怎么设置的吗?我想用0.13版本。

我的目录结构非常简单(不像 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
64988 次浏览

您需要将应用程序的源代码放在 src/main/scala/中,project/是用于构建定义代码的。

下面是如何指定 main 类

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 没有告诉任何它不知道默认使用哪个模块的信息。

Big Hint to typesafe : 请添加默认输出,如:

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

在 SBT 结束时开始降低挫折的水平,而使用 SBT 的多模块项目..。

如果您的项目中有多个 main 方法,您可以将以下代码行添加到 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 命令指定 main 类以运行:

sbt "run-main com.saeed.ApplicationMain"

或者

activator "run-main com.saeed.ApplicationMain"

尝试使用一个对象并从 App 扩展它,而不是使用 class

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

我遇到了同样的问题: 在 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:

  1. 您需要手动设置主类。

    mainClass in run := Some("a.b.DummyMain1")
    
  2. You could run with main class as parameter

    sbt runMain a.b.DummyMain1
    

如果 Main 类在另一个项目中,那么通过在 build.sbt中设置以下命令可以工作:

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

我有同样的问题。解决后,增加了 PlayMinimalJava插件在 build.sbt

不知道如何得到修复,如果有人能突出 PlayMinimalJava如何解决它,将是伟大的。

enablePlugins(PlayMinimalJava)

我的 build.sbt是这样的

organization := "org"
version := "1.0-SNAPSHOT"
scalaVersion := "2.13.1"
libraryDependencies += guice
enablePlugins(PlayMinimalJava)

木头

C:\Users\KulwantSingh\repository\pdfdemo>sbt run
Java HotSpot(TM) Client VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
[info] Loading settings for project pdfdemo-build from plugins.sbt ...
[info] Loading project definition from C:\Users\KulwantSingh\repository\pdfdemo\project
[info] Loading settings for project pdfdemo from build.sbt ...
[info] Set current project to pdfdemo (in build file:/C:/Users/KulwantSingh/repository/pdfdemo/)
[warn] There may be incompatibilities among your library dependencies; run 'evicted' to see detailed eviction warnings.


--- (Running the application, auto-reloading is enabled) ---


[info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000


(Server started, use Enter to stop and go back to the console...)


[info] Compiling 6 Scala sources and 2 Java sources to C:\Users\KulwantSingh\repository\pdfdemo\target\scala-2.13\classes ...
[info] p.a.h.EnabledFilters - Enabled Filters (see <https://www.playframework.com/documentation/latest/Filters>):


play.filters.csrf.CSRFFilter
play.filters.headers.SecurityHeadersFilter
play.filters.hosts.AllowedHostsFilter


[info] play.api.Play - Application started (Dev) (no global state)

以防有人像我一样犯了愚蠢的错误。

检查您的项目是否是 sbt-multi 项目。 如果它是确保提供 sbt moduleName/run而不是 sbt run

当我在多个项目和单个项目之间切换时,我一直犯这个错误。