【问题标题】:how to set main class in SBT 0.13 project如何在 SBT 0.13 项目中设置主类
【发布时间】:2013-03-31 06:41:59
【问题描述】:

你们能解释一下如何在 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 构建是否可能是问题的一部分?
  • @RandallSchulz 不。因为我可以编译。同样为了实验,我更改了设置,让 SBT 获取 Scala 编译器并重命名 mainClass 中的类名称。 sbt run 仍然有效 :) 这表明 SBT 只是忽略了该设置。
  • @HeikoSeeberger 我拿走了 SBT 网站上的最新消息。标准 Play Framework 项目的目录结构不同。我想强制 Play 使用最新版本的 scala 而不是强制使用 2.9.2。你能支持这个问题吗?
  • 您遗漏了一些要点:首先,scala-sbt.org 将 0.12.3 显示为最新(已发布)版本。其次,sbt 内部使用的 Scala 版本与您项目的 Scala 版本无关,除非您在构建中未设置不同的 scalaVersion 时将其用作默认值。第三,与许多其他 Scala 库一样,Play 是针对特定版本的 Scala 编译的,您必须使用该版本(或二进制兼容升级)。第四,我在这里完全代表我自己。
  • @HeikoSeeberger 此问题中描述的问题与 alpha 版本无关。但不错的尝试。

标签: scala sbt


【解决方案1】:

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

【讨论】:

  • 没有帮助。此外,我现在什至无法编译。获取 Java 异常pastebin.com/MUbRQfvx
  • 不同的问题,删除autoScalaLibrary := false & scalaHome := Some(file("/Program Files (x86)/scala/")) 行并设置scalaVersion := "2.10.1"
  • 你是对的。异常是由autoScalaLibrary 引起的。谢谢!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这里是指定主类的方法

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

    【讨论】:

    • 其实mainClass := Some("Hi") 也可以,因为如果在更具体的范围内没有键值,sbt 会退回到更一般的范围内。
    • @HeikoSeeberger mainClass := Some("Hi") 如果我的项目有两个使用 main 方法的类,则在 0.12.3 中不起作用。 SBT 让我选择课程。
    • 如果您使用的是 scala,它还期望 Mainextends Appobject。我真的很笨,这让我有点悬。
    • 我的项目中也有多个主类,可运行的应用程序,但我长时间只重复运行一个,预选非常有用。我把它放到我的 buid.sbt 文件中: mainClass in (Compile,run) := Some("my.home.z033.rngtest.RngTest1") ..它工作得很好。缩短的变体:mainClass := Some("my.home.z033.rngtest.RngTest1") 对我不起作用(sbt 0.13.1)
    【解决方案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 时的挫败感.....

    【讨论】:

      【解决方案5】:

      如果您的项目中有多个主要方法,您可以将以下行添加到您的 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"
      

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • Conny,你可以问我 :) 我坐在你面前哈哈
        • @PongpiraUpra 甚至我也是 :)
        • @VishalJohn 哈哈哈
        【解决方案7】:

        有 4 个选项

        1. 你有 1 个主要课程

          • sbt run 和 sbt 会为你找到 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
          

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

            我遇到了同样的问题。在build.sbt添加PlayMinimalJava插件后解决。

            不确定它是如何解决的,如果有人能强调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)
            

            【讨论】:

              猜你喜欢
              • 2013-12-05
              • 2013-12-29
              • 2013-10-02
              • 1970-01-01
              • 2014-06-05
              • 2012-02-18
              • 1970-01-01
              • 2013-10-30
              • 2021-05-11
              相关资源
              最近更新 更多