Scala项目不会在Eclipse中编译; “无法找到主类。”

时间:2010-10-17 13:46:20

标签: eclipse scala eclipse-plugin scala-ide

我已经从/ update-current安装了Eclipse 3.5.2和今天的Scala插件(这是Scala 2.8 final。)我可以编译并运行由单个单例对象组成的Scala项目,该对象实现main()。

但是,如果项目包含更多类,我会收到“找不到主类”错误。

我试过寻找解决方案,然后发现:

Eclipse正在寻找Main $类,而不是Main类 *在Debug Configurations下,我的主类被正确识别为mypackage.Main
*我的插件是最新的,推荐用于我的Eclipse版本 *清洁,重新启动等没有帮助。

同一个项目将使用scalac进行编译。

感谢您提供有关如何解决此问题的任何想法。

编辑:MatthieuF建议我发布代码。

此代码段会产生错误。它不是最惯用的代码,但我用它来编写测试环境的方法。我把它作为单个文件和单独的文件尝试。它与scalac合作。

import swing._

class HelloFrame extends Frame {
        title = "First program"
        contents = new Label("Hello, world!")
}

object Hello {
  val frame = new HelloFrame    
  def main(args : Array[String]) : Unit = {
        frame.visible = true
   }
}

但是,如果我在Hello中嵌入HelloFrame的定义,它就可以了。这个片段完美运行:

import swing._

object Hello {

    class HelloFrame extends Frame {
        title = "First program"
        contents = new Label("Hello, world!")
    }

    val frame = new HelloFrame

    def main(args : Array[String]) : Unit = {
        frame.visible = true
    }
}

12 个答案:

答案 0 :(得分:21)

对我来说,问题是存在构建错误(请参阅“问题”选项卡),这会阻止编译;哎呀!您看到错误的原因是尽管编译步骤失败,运行宏仍会继续,并尝试运行它期望存在的类文件;它们不存在,因为存在阻止编译的构建错误,所以它说它找不到Main(未编译)。

当构建成功完成时问题消失,即错误得到修复。

我想,从理论上讲,可能有更复杂的原因导致您的构建未成功完成但未在问题中列出。

答案 1 :(得分:5)

一种可能性是您尝试使用ctrl-F11启动,但是来自不同的类。

Scala Eclipse插件不遵循Java启动的默认值。在首选项 - >运行/调试 - >启动中,有一些选项启动操作 - >始终启动以前选择的应用程序等。这当前在Scala eclipse插件中不起作用。要启动指定的main,您需要从该类的编辑器中启动它。

为此提出了一个错误。 http://scala-ide.assembla.com/spaces/scala-ide/tickets/1000023-scala-launch--does-not-follow-jdt-behaviour

编辑:现在(大部分)修复了这个问题。

答案 2 :(得分:4)

对我而言,这是Eclipse特有的问题。我注意到.class文件根本没有构建。所以bin目录没有编译类。 当我使用* .sbt手动编译* .scala文件并将其复制到bin目录时,它按预期工作。 我尝试了不同的提示和技巧,直到我重新安装了Eclipse中的Scala插件,它才起作用。

答案 3 :(得分:2)

我通过执行"项目 - >清洁..."解决类似的问题。下一步自动构建。

答案 4 :(得分:1)

我和我自己制作的Java应用程序有相同的错误消息。

问题是我删除了(虽然在Eclipse中)一个属于 Java构建路径的jar,而没有从Java构建路径(项目的Properties窗口)中删除它。当我这样做时,课程可以编译并再次运行。

答案 5 :(得分:0)

确保.class文件存在,通常位于bin目录下方。

特别是,如果同一项目中的不相关文件中存在错误,则编译可能会失败,并且不会生成.class个文件。

答案 6 :(得分:0)

可能存在包含错误的项目添加到应用程序的构建路径中,这会阻止成功编译的完成。确保在运行应用程序之前从构建路径中删除任何此类项目。

删除这些项目解决了我的问题。

答案 7 :(得分:0)

您是否有正确的构建工具设置?像sbt你安装了吗?

您可以通过$ sbt --version

查看其版本

如果没有设置,您可以从此处下载http://www.scala-sbt.org/download.html

安装后可能需要重新启动eclipse。

答案 8 :(得分:0)

只需复制您的XXX.scala文件代码即可。删除包并创建一个新的Scala类。粘贴您的XXX.scala代码。 (如果您正在使用maven,请执行maven clean并构建。)再次运行配置。这对我有用。

答案 9 :(得分:0)

我遇到过这个问题。我刚刚删除了包名,创建了scala类,编写了相同的代码,将Build Build设置为“Buildmaticallymatically”。最后,它完美无缺。

答案 10 :(得分:0)

检查scala-ide.log

对我来说,问题是错误:

AppData \ Local \ Temp \ sbt_10d322fb \ xsbt \ ClassName.scala:16:错误:未找到:value enteringPhase     enteredPhase(currentRun.flattenPhase.next){s fullName separator}

答案 11 :(得分:0)

如果您使用的是Intellij,请将目录标记为源根