在Scala程序执行期间进入Scala解释器

4
我正在尝试在Scala程序中间调用Scala解释器。 我看到了这个非常有趣的问题,但它似乎在Eclipse(3.5.2 + Scala插件)中无法正常工作。

I get the following error:

Exception in thread "main" java.lang.NoClassDefFoundError: scala/io/LowPriorityCodecImplicits
    at scala.tools.nsc.Interpreter$.breakIf(Interpreter.scala:1265)
    at userInterface.CommandInterpreter$$anonfun$main$1.apply$mcVI$sp(CommandInterpreter.scala:102)
    at scala.collection.immutable.Range$ByOne$class.foreach$mVc$sp(Range.scala:275)
    at scala.collection.immutable.Range$$anon$1.foreach$mVc$sp(Range.scala:267)
    at userInterface.CommandInterpreter$.main(CommandInterpreter.scala:101)
    at userInterface.CommandInterpreter.main(CommandInterpreter.scala)
Caused by: java.lang.ClassNotFoundException: scala.io.LowPriorityCodecImplicits
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    ... 6 more

如果我使用scalac编译并在终端上运行,相同的代码可以正常工作。可能出了什么问题?是Eclipse的问题吗?

谢谢!

PS:这是我尝试让其工作的简化版本:

import scala.tools.nsc.Interpreter._
object ScalaShell {
  def main(args: Array[String]) {
    break(Nil)
  }
}

我无法在Eclipse中使其工作,但如果我使用“scala”命令启动可执行文件,则可以正常工作...就像这样: “scala packageName.classWithMain” 例如: “scala userInterface.controller” 请替换您自己的包名称和类!问题是Eclipse使用“java”可执行文件调用程序,而不是“scala”。我不知道如何修改此行为。 - user406752
1
问题可能与其他问题的评论中提到的相同:Eclipse使用java -classpath ...而不是scala -classpath ...启动进程。尝试将scala-compiler.jar添加到类路径中,看看是否有效。 - Jesper
我尝试过了,但是Eclipse使用的命令仍然是java,而不是scala(在调试器视图中可以看到)。 到目前为止,解决方案是使用命令行。 - user406752
1
@stephan 你尝试将 scala-compiler.jar 添加到 Eclipse 项目的类路径中了吗?这样应该可以解决问题(虽然我自己没有尝试过),即使程序是用 java 而不是 scala 启动的。 - Jesper
@stephan 如果你使用编辑器打开scala,你会发现它只是一个调用java的shell脚本。因此唯一的区别在于类路径中包含了什么内容。 - Daniel C. Sobral
1个回答

1

您没有提及使用的Scala命令行工具或Scala IDE for Eclipse的版本,但我猜测您正在使用的命令行工具是2.8.0,而Eclipse工具是2.7.x,或者您在Eclipse项目类路径中有一个2.7.x scala-library .jar文件(可能通过Maven依赖项引入)。

如果是这种情况,那么安装2.8.0.final的Eclipse工具应该可以解决您的问题。如果不能解决,则可能是SDT中的错误,您应该在此处报告它。


是的,它是Scala 2.8版本(据我所知,break(Nil)仅在2.8中受支持)。 我不确定这是否是一个错误,因为编译后的二进制文件在命令行中可以正常工作:它们只需要使用“scala”命令启动,而不是使用“java”(就像Eclipse一样)。 - user406752
你在Eclipse中进行了什么样的启动?你是使用Scala IDE for Eclipse作为Scala应用程序运行的吗? - Miles Sabin

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