How to call the scala interpreter in a Simple Build Tool project?
我的scala程序正在使用scala.tools.nsc.interpreter.IMain中的编译器接口。当我使用scalac进行编译时,一切都会按预期进行。但是,当我使用sbt进行编译时,它仍然可以编译,但是在执行时,它会从IMain实例的解释方法调用中引发以下错误消息:
1 2 3 4
| 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,则会收到以下异常:
1
| java. lang. Error: typeConstructor inapplicable for <none > |
我的SBT项目定义:
1 2 3 4
| 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
- 跑步时会叉吗?如果没有,请先尝试。参见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选项。
-
另请参阅以下答案:stackoverflow.com/questions/4713031/…
1
| sbt console // Starts a Scala interpreter |
这是新的常见问题解答(以前的答案已过时)
http://www.scala-sbt.org/0.12.4/docs/faq.html
您也可以找到有关最新版本的常见问题解答。
请注意,sbt console-quick会加载没有依赖项的控制台。
看看SBT Wiki:http://www.scala-sbt.org/0.13/docs/Faq.html#如何在代码中使用Scala解释器?
其中有一个有关运行解释器的条目。
- 最终,在迁移到sbt 0.10之后,它按照FAQ中的说明工作。谢谢你。
在较新的sbt版本(0.12和更高版本)中,满足以下条件即可: