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


77

你们能告诉我如何在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 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

您的经验并不典型。您是否考虑过您的非标准Scala构建可能是问题的一部分?
Randall Schulz

2
@RandallSchulz不。因为我可以编译。同样为了实验起见,我更改了设置,让SBT获得Scala编译器,并在中重命名了类的名称mainClasssbt run无论如何都有效:)这表明SBT只是忽略了该设置。
专家

4
@HeikoSeeberger我采用了SBT网站上的最新信息。标准Play Framework项目的目录结构不同。我想强制Play使用最新版本的scala,而不是强制使用2.9.2。你能赞成这个问题吗?
专家

1
您缺少一些要点:首先,scala-sbt.org显示0.12.3为最新(发布)版本。其次,内部使用的Scala版本sbt与项目的Scala版本无关,不同之处在于,如果未scalaVersion在构建中设置其他值,它将用作默认值。第三,与其他许多Scala库一样,Play是针对特定版本的Scala编译的,您必须使用该版本(或二进制兼容的升级版)。第四,我在这里完全代表自己行事。
Heiko Seeberger

1
@HeikoSeeberger此问题中描述的问题与Alpha版本无关。但是不错的尝试。
专家

Answers:


49

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


没帮助 而且我现在什至不能编译。获取Java异常 pastebin.com/MUbRQfvx
专家

6
不同的问题,删除autoScalaLibrary := falsescalaHome := Some(file("/Program Files (x86)/scala/"))排行并设置scalaVersion := "2.10.1"
Jed Wesley-Smith

你是对的。引起异常autoScalaLibrary。谢谢!
专家


16

这是如何指定主类

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


4
实际上mainClass := Some("Hi")也可以,因为如果在更具体的范围内没有键的值,那么sbt将退回到更通用的范围。
Heiko Seeberger

1
mainClass := Some("Hi")如果我的项目有两个带main方法的类,则@HeikoSeeberger在0.12.3中不起作用。SBT要求我选择课程。
专家

4
如果您使用的是Scala,则它也希望Mainextends Appobject。我真的很傻,这让我有些困惑。
BeepDog

2
我的项目中也有多个主类,可运行的应用程序,但长时间重复运行一次,预选非常有用。我把它放到我的buid.sbt文件中:mainClass in(Compile,run):= Some(“ my.home.z033.rngtest.RngTest1”)..并且它运行良好。mainClass的简化变体:= Some(“ my.home.z033.rngtest.RngTest1”)对我不起作用(sbt 0.13.1)
Espinosa

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无关,它不知道默认情况下使用哪个模块。

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

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

在多模块项目中使用SBT时,在SBT结束时开始降低挫败感。


3

如果项目中有多个主要方法,则可以将以下行添加到build.sbt文件中:

val projectMainClass = "com.saeed.ApplicationMain"

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

如果要指定将应用程序打包为JAR文件时将添加到清单的类,请将此行添加到build.sbt文件中:

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

您还可以使用sbt中的run-main命令和激活程序来指定主类来运行:

sbt "run-main com.saeed.ApplicationMain"

要么

activator "run-main com.saeed.ApplicationMain"

3

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

事实证明,后来数小时的头部刮擦,我cd hello每次都错过了示例中的关键线。:-(


6
康妮,你可以问我:)我坐在你
面前

1
@PongpiraUpra甚至我也:)
Vishal John

1
@VishalJohn haha​​ha
Sam Upra

难以置信,谢谢您的回答!
mohit6up

1

有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("a.b.DummyMain1")
    
  2. 您可以将主类作为参数运行

    sbt runMain a.b.DummyMain1
    

1

如果Main类位于其他项目中,则通过设置以下命令build.sbt将起作用:

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

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.