【发布时间】:2011-09-13 00:39:36
【问题描述】:
我的 scala 程序正在使用来自 scala.tools.nsc.interpreter.IMain 的编译器接口。当我使用 scalac 进行编译时,一切都按预期工作。但是当我用 sbt 编译时它仍然可以编译,但是在执行时它会在 IMain 实例的解释方法调用中抛出以下错误消息:
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"
}
这里有什么问题?以及如何在简单构建工具项目中使用解释器?
我正在使用 Scala 2.9.0 和 Simple Build Tool 0.7.7
【问题讨论】:
-
跑步时你会fork吗?如果不先尝试。见code.google.com/p/simple-build-tool/wiki/Forking
-
谢谢,这几乎成功了。我在项目定义中添加了
override def fork = forkRun。解释器可以运行简单的代码,但不能实例化项目中定义的类。我可以为 fork 添加一个工作目录。但是我应该选择哪一个? -
在尝试了一些它正在使用的路径之后:
override def fork = forkRun(new File("target/scala_2.9.0/classes"))这不是一种糟糕的解决方法吗? -
我也遇到过。正如您所发现的,问题在于分叉作业对项目类路径一无所知。一个更普遍的问题是嵌入式 Scala 解释器不一定继承父 Scala 进程的类路径。我使用的解决方法是创建一个 SBT 任务,将所有类路径元素(target/、lib_managed/ 等)放在 Java 类路径系统属性中;然后,当我启动解释器时,我使用
usejavacp选项。
标签: scala interpreter sbt