如果IntelliJ包含主脚本,为什么不运行我的脚本

时间:2019-01-19 19:25:58

标签: scala intellij-idea

我正在观察一个有趣的行为。我有一个现有项目,在其中创建一个文件夹并在该文件夹中创建了一个Scala脚本。要运行它,我做了

  1. 编写一个Scala脚本,例如MyScript.scala
  2. 在菜单中选择:运行->编辑配置...按“ +”(在此对话框中,⌘N也适用于Mac)选择“ Scala脚本”,然后在此对话框中选择脚本文件

有趣的是,如果脚本如下,则会出现错误Scala script not found

object HelloWorld{

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

但是如果脚本是

def greetings(): Unit ={
  println("hello")
}


greetings();

然后它起作用了!

为什么IntelliJ无法运行脚本的第一个版本?

1 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

作为脚本运行。 您必须使用以下代码:

class HelloWorld {
  def main(args:Array[String]): Unit ={
    println("hello world");
  }
}    
object Foo extends HelloWorld
Foo.main(args)

enter image description here

提示:我从“启动前”中删除了“生成”操作,以进一步显示警告。

作为应用程序运行。 您可以保留您的代码。创建配置时只需选择“应用程序”。

object HelloWorld{

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

enter image description here

为什么?

您必须提供脚本的入口点。因此,您可以使用以下代码:

object HelloWorld {
  def main(args:Array[String]): Unit ={
    println("hello world");
  }
}
HelloWorld.main(args) //without this line, Script is not found!

但这会产生错误(预期的类或对象定义):

enter image description here

如果您尝试从应用特征中扩展,则会收到2条警告:

object HelloWorld extends App {
  override def main(args:Array[String]): Unit ={
    println("hello world");
  }
}
HelloWorld.main(args)

enter image description here

因此,我想最好使用上述两个解决方案之一。