如何使用JSR-223在sbt控制台中获取Scala解释器?

如何使用JSR-223在sbt控制台中获取Scala解释器?,scala,sbt,jsr223,scala-2.11,Scala,Sbt,Jsr223,Scala 2.11,在sbt控制台(sbt版本0.13.5,Scala版本2.11.1)中,我可以获得Scala的javax.script.ScriptEngine: scala> val engine = new javax.script.ScriptEngineManager().getEngineByName("scala") engine: javax.script.ScriptEngine = scala.tools.nsc.interpreter.IMain@bf78a9 但是,我不能使用它:

在sbt控制台(sbt版本0.13.5,Scala版本2.11.1)中,我可以获得Scala的
javax.script.ScriptEngine

scala> val engine = new javax.script.ScriptEngineManager().getEngineByName("scala")
engine: javax.script.ScriptEngine = scala.tools.nsc.interpreter.IMain@bf78a9
但是,我不能使用它:

scala> engine.eval("3")
[init] error: error while loading Object, Missing dependency 'object scala in compiler mirror', required by /usr/lib/jvm/java-7-openjdk-i386/jre/lib/rt.jar(java/lang/Object.class)

Failed to initialize compiler: object scala in compiler mirror 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.
scala.reflect.internal.MissingRequirementError: object scala in compiler mirror not found.
  at ...
,我应该用
设置
做一些魔术,然后将它传递给我的
解释器
的构造函数。但是,我没有直接创建
解释器
(甚至不清楚我是否间接创建它,因为引擎对象是
IMain


Scala
ScriptEngine
是否有办法在SBT控制台上工作?

您可以将引擎强制转换为
Scala.tools.nsc.interpreter.IMain
,这样您就可以访问
设置。然后您可以使用
embeddedDefaults
将类路径设置为。只需在调用
eval
方法之前执行此操作

val engine = new javax.script.ScriptEngineManager().getEngineByName("scala")
val settings = engine.asInstanceOf[scala.tools.nsc.interpreter.IMain].settings
// MyScalaClass is just any class in your project
settings.embeddedDefaults[MyScalaClass]
假设您应该能够运行
eval
,例如

scala> engine.eval("10")
res3: Object = 10

原因或多或少在报告中有所解释。基本上,当使用
getEngineByName(“scala”)
创建解释器时,使用
java.class.path
,它只包含
sbt launch.jar
。使用
embeddedDefaults
的技巧将类路径设置为正确的值(您可以在调用
embeddedDefaults
之前和之后检查
设置)。

为了完整性,
sbt-Dscala.usejavacp=true console
使getEngine失败。我认为jsr223的更改使得类路径的调整值得回顾。Thx的主要链接,我没有看到的历史。