82

你们能解释一下如何在 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
4

9 回答 9

53

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

于 2013-04-09T01:22:07.680 回答
27

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

object Main extends App {
  println("Hello from main scala object")
}
于 2016-02-09T12:29:25.307 回答
16

这是指定主类的方法

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

于 2013-04-09T03:04:30.540 回答
6

对于 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 时的挫败感.....

于 2013-06-25T05:55:26.383 回答
3

如果您的项目中有多个主要方法,则可以将以下行添加到 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"
于 2015-09-13T06:01:01.697 回答
3

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

事实证明,几个小时后,我cd hello每次都错过了示例中的关键线。:-(

于 2017-05-31T06:40:46.343 回答
2

有4个选项

  1. 你有 1 个主要课程

    • sbt runsbt 会为你找到 main
  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("a.b.DummyMain1")
    
  2. 您可以使用主类作为参数运行

    sbt runMain a.b.DummyMain1
    
于 2018-12-19T10:05:18.240 回答
1

如果 Main 类在不同的项目中,那么通过设置以下命令build.sbt将起作用:

addCommandAlias("run", "; project_folder/run")
于 2019-04-22T23:23:11.897 回答
0

我遇到过同样的问题。添加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)
于 2020-02-18T08:37:26.077 回答