【问题标题】:No main class detected未检测到主类
【发布时间】:2017-09-23 18:38:27
【问题描述】:

问题是,当我打开“cmd.exe”并进入名为 chesschallenge6 的目录输入“sbt”命令并随后“运行”时它不起作用。我收到一条错误消息,说没有指定主类。我检查了主类名是否与其文件名相同,甚至尝试过“object ChessChallenge6 extends App”,但它仍然不起作用。解决方法很简单,但我就是没看到。

└── _chesschallenge6
    ├── _project
    ├── _target
    └── _src      
        ├── _test
        └── _main
            ├── _algorithm
            ├── _model
            └── ChessChallenge6.scala

【问题讨论】:

  • 你能分享一个可重现的例子吗?
  • 我从不分享代码示例。我应该简单地使用 github 吗?
  • 如果你将你的 scala 类移动到 src/main/scala 会发生什么?
  • 您可以将代码添加到问题本身。所以... 一般来说... 可运行的 JVM 项目至少需要一个类来提供public static void main 方法... JVM 将运行该方法。
  • 我在 _main 中创建了一个名为 scala 的目录,然后将我的主类移到那里,它不再显示“未检测到主类”错误。谢谢汤姆

标签: scala class sbt main runtimeexception


【解决方案1】:

您的问题有些不清楚。以下是我对问题的最佳猜测:

目录结构错误

请确保您的 scala 文件位于“src/main/scala/ChessChallenge6.scala”中,相对于您运行 sbt 的目录。

我不确定您是否在目录名称中使用了下划线,或者这是您仅在问题文本中使用的某种格式。如果您使用下划线,则需要删除它们(或配置 sbt 以在非标准目录中查找您的源代码)。

如果您不使用它们,则应将它们从问题文本中删除,因为它们会造成混淆。 (如果您想在列表中区分文件和目录,通常的约定是在目录名称的末尾添加“/”,例如“src/”。)

http://www.scala-sbt.org/0.13/docs/Directories.html

在错误的目录中运行 sbt

您必须在src 上方的目录中运行sbt。在您的问题的最新版本中,这将在 chesschallenge6 目录中。

【讨论】:

  • 我不使用下划线。这是我自己的方式来区分我的问题中的文件夹和文件。别介意。只是盲目地从某个地方复制。
  • 那应该可以正常工作。请您将“ChessChallenge6.scala”的相关部分添加到您的问题中吗?
  • 即使将主类移动到“scala”目录是解决方案,我还应该添加它们吗? PS。我编辑了问题中的目录结构,因此它显示了此时它的真实样子。对不起,大惊小怪,现在一切都好。
【解决方案2】:

我遇到了这个确切的问题,问题是我使用的是 class 而不是 object

例如,确保你的主类不是这样的:

class ChessChallenge6 {

  def main(args: Array[String]): Unit = {
    println("hello")
  }

}

相反,它应该是:

object ChessChallenge6 {

  def main(args: Array[String]): Unit = {
    println("hello")
  }

}

注意第一个词是object而不是class

【讨论】:

  • 为什么反对兄弟?
  • ChessChallenge6 是一个单例对象:一个只有一个实例的类。我们只想要一个主类的实例是有道理的。单独定义一个类需要然后创建它的一个实例。此外,Object 只创建一个单例,并暗示我们只想要一个。
猜你喜欢
  • 1970-01-01
  • 2019-09-24
  • 2018-02-21
  • 1970-01-01
  • 2014-01-13
  • 2019-11-10
  • 1970-01-01
  • 2016-05-25
  • 2014-12-23
相关资源
最近更新 更多