如何在IntelliJ IDEA中运行Scala脚本?

32

这里是一个简单的Scala脚本:

object test {
  def hi() { print("hi there from here") }
}


test.hi()

从命令行执行时,它会按预期运行:

scala /shared/scaladem/src/main/scala/test.scala
Loading /shared/scaladem/src/main/scala/test.scala...
defined module test
hi there from here
Welcome to Scala version 2.10.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_65).
Type in expressions to have them evaluated.
Type :help for more information.

scala>

但是在Intellij中会出现编译错误。右键单击|运行test.scala测试。

expected class or object definition
test.hi()
^

顺便提一句,我也尝试将其作为scala工作表运行。那更糟糕 - 大量的垃圾输出,甚至没有编译的机会。

更新:似乎有一个旧的但类似的问题:

如何在Intellij Idea 10中运行Scala代码

我进入了运行配置并取消了勾选"Make"(按照指示这很麻烦,但没办法..)

然而,在进行了那个更改之后,我得到了另一个错误:

Exception in thread "main" java.lang.NoClassDefFoundError: scala/Either
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:190)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:113)
Caused by: java.lang.ClassNotFoundException: scala.Either
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 3 more
注意:Scala库已经正确设置:
另一个更新(在@lhuang下面的评论之后),我按照建议从头开始创建了另一个项目。 在这种情况下,Scala工作表可以正常工作(test.sc)。 但是,一个scala脚本(当通过“scala test.scala”运行命令行时有效)在这个全新的“scala”项目中仍然无法工作。

它应该在Scala工作表中运行。你能试着创建一个新的干净的Scala并使用Scala home配置吗? - longhua
@lhuang。你所说的“一个新的干净的Scala”是什么意思? - WestCoastProjects
我是说你可以尝试创建一个新的Scala项目。 - longhua
1
@lhuang 你说得对。创建新的Scala项目,然后在工作表中运行可以正常工作。但通常似乎需要“创建一个新的Scala项目”才能使所有Scala正常工作,这很麻烦。此外,它会创建561个空白行,不知道为什么。 - WestCoastProjects
是的,创建一个新的Scala项目不应该是解决方案。然而,大多数情况下,这种错误是由一些无效的配置引起的。而且我们很难找出问题所在。现在,您可以在一个干净的项目中使其工作。这样,您就可以比较这两个项目,找出以前项目的问题所在。 - longhua
@lhuang。我进行了比较。但原始项目似乎没有配置问题。这也是我发布截图的部分原因。唯一能说的是 - Eclipse Scala IDE 也有漏洞。 - WestCoastProjects
4个回答

20

这里的答案是一个组合项:

  • (a) 创建一个全新的Scala项目(如@lhuang所建议的),以及
  • (b) 在运行脚本时,您需要进入“运行配置”并删除“制作”步骤(如“相关”的SOF问题中所述)。

这显示了Intellij及其scala插件的粗糙边缘。特别是当我想要将scala与java集成时,如果使用Intellij,这显然是困难的,即使可能也需要经常创建新的Scala项目,这对于试图将scala纳入主要为Java开发的项目来说是不可行的。

但对于以Scala为主的项目来说,这似乎是可行的。


19

我用的方法是:

  1. 编写Scala脚本,例如MyScript.scala
  2. 在菜单中选择:Run->Edit Configurations...
  3. 点击“+”(在Mac上⌘N也可以在此对话框中起作用)
  4. 选择“Scala Script”
  5. 然后在此对话框中选择您的脚本文件 enter image description here

现在你可以运行你的脚本了。虽然有点不方便,但是它是有效的。

注意:这个方法适用于我使用的IntelliJ IDEA 14.x版本


我尝试了这个,但是出现了“Scala脚本未找到”的错误!这很奇怪,因为我可以看到文件,并且已经使用“编辑配置”的文件选择器选择了它。你有什么想法我可能做错了什么吗? - Manu Chadha
1
我发现了一个有趣的观察。请问您能否查看这个链接 https://stackoverflow.com/questions/54270601/why-intellij-doesnt-run-my-script-if-it-has-main-in-it - Manu Chadha
抱歉Manu Chadha,我来晚了,刚看到你的评论。很高兴你的帖子已经有了答案。一个真正好而且详细的答案...我喜欢StackOverflow这里的用户 :-) - Kai Mechel

4

你的代码在命令行中可以工作,因为它是“脚本”,当你想让它在项目中可运行时,有几种方法可以实现

  1. By creating object which extends App

    object test {
        def hi() { print("hi there from here") }
    }
    
    object runnable extends App {
        test.hi()
    }
    
  2. or java-like solution i.e. creating main method

    object test {
        def hi() { print("hi there from here") }
    }
    
    object runnable {
        def main(args: Array[String]) {
            test.hi()
        }
    }
    
  3. when need to execute as script - I do it like that: select code to execute by mouse, then choose from context menu "Send Selection To Scala Console"


7
重点是能够在IntelliJ中运行脚本而无需更改脚本。你的回答没有解决问题作者提出的问题。 - WestCoastProjects
作者使用了关键词“脚本”和“编译”,所以我给了提示进行编译。如果有人想要像脚本一样执行脚本,我会按照帖子中描述的方式来执行(编辑-添加关于脚本的信息)。 - guzial
2
你的回答与原文和意图都相差甚远。OP要求能够从“运行配置”中运行此程序,如果您想通过鼠标选择,则完全不同。JetBrains公司已经将其视为一个错误,并为此创建了一个JIRA - 因此以这种方式回答是不准确的。 - WestCoastProjects
1
我很高兴阅读你的指南。是的,答案与这些关键字相当不同,但编译脚本是什么意思呢?在我看来,这似乎是初学者的问题(运行简单代码),我试图提供帮助,并且我认为这对于使用插件开始Scala的人们可能会有所帮助。 - guzial
5
问题在于,你脑海中已有一个答案,而不管实际问题是什么。就像谚语所说:“手中只有一把锤子,看什么都像钉子。” 这个问题不是关于“如何在Intellij中使用Scala”的。而且那个特定问题已经有一个被接受并赞同的答案了。 - WestCoastProjects

1

首先有两件事需要理解。Scala既可以作为解释器,也可以作为编译器。你正在尝试使用解释器“scala test.scala”,而没有使用“scalac test.scala”,解释器也可以在没有main方法的情况下工作。

另一种方法是在Intellij中打开终端或命令提示符,并从文件位置运行scala test.scala(前提是系统路径中存在Scala)。


1
嗯,Intellij可能是目前最强大的Scala IDE。它支持Scala脚本(以解释模式运行)。你关于解释器与编译器的评论,我在2010年10月学习Scala的第一天就知道了。 - WestCoastProjects

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接