如何在 Simple Build Tool 项目中调用 Scala 解释器?

20

我的Scala程序使用scala.tools.nsc.interpreter.IMain的编译器接口。当我使用scalac编译时,一切都正常。但是当我使用sbt编译时,虽然它仍然编译成功,但在调用IMain实例的interpret方法时,它会抛出以下错误信息:

Failed to initialize compiler: object scala not found.
** Note that as of 2.8 scala does not assume use of the java classpath.
** For the old behavior pass -usejavacp to scala, or if using a Settings
** object programatically, settings.usejavacp.value = true.

如果我在IMain实例上使用settings.usejavacp.value = true,则会收到以下异常:

java.lang.Error: typeConstructor inapplicable for <none>

我的SBT项目定义:

class Project(info: ProjectInfo) extends DefaultProject(info){
    val scalaSwing = "org.scala-lang" % "scala-swing" % "2.9.0"
    val scalaCompiler = "org.scala-lang" % "scala-compiler" % "2.9.0"
}

这里有什么问题?我如何在Simple Build Tool项目中使用解释器?

我正在使用Scala 2.9.0Simple Build Tool 0.7.7


1
你在运行时是否进行了分叉?如果没有,请先尝试。请参阅http://code.google.com/p/simple-build-tool/wiki/Forking - huynhjl
1
谢谢,这差不多就可以了。我在项目定义中添加了override def fork = forkRun。解释器可以运行简单的代码,但无法实例化项目中定义的类。我可以为fork添加一个工作目录。但是我应该选择哪一个呢? - Felix Dietze
经过尝试一些路径后,它可以正常工作:override def fork = forkRun(new File("target/scala_2.9.0/classes")) 这不是一种糟糕的权宜之计吗? - Felix Dietze
我也遇到过这个问题。正如您所发现的那样,问题在于分叉作业不知道有关项目类路径的任何信息。更一般的问题是,嵌入式Scala解释器不一定继承父Scala进程的类路径。我使用的解决方法是创建一个SBT任务,将所有类路径元素(target /,lib_managed /等)放在* Java *类路径系统属性中;然后,在启动解释器时,我使用“usejavacp”选项。 - Kipton Barros
另请参考此答案:https://dev59.com/1FPTa4cB1Zd3GeqPjXWk#4937135 - robinst
3个回答

24
sbt console // Starts a Scala interpreter

这里是最新的常见问题解答 (之前的答案已经过时)

http://www.scala-sbt.org/0.12.4/docs/faq.html

你也可以查阅更新版本的常见问题解答。
请注意,sbt console-quick会在不加载依赖项的情况下加载控制台。


6

终于在迁移到sbt 0.10之后,它按照FAQ中所述正常工作了。谢谢。 - Felix Dietze

1
在更近的sbt版本中(0.12及以上),以下内容应足够:
fork in run := true

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