5

在 sbt 控制台,sbt 版本 0.13.5,Scala 版本 2.11.1,我可以得到javax.script.ScriptEngineScala:

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 ...

根据 SBT FAQ,我应该用 a 做一些魔术Settings,然后将它传递给我Interpreter的构造函数。但是,我没有直接创建一个Interpreter(甚至不清楚我是否间接创建它,因为引擎对象是一个IMain)。

Scala 有什么方法可以ScriptEngine在 SBT 控制台上工作吗?

4

1 回答 1

5

您可以将引擎转换为scala.tools.nsc.interpreter.IMain,这将使您可以访问settings. 然后您可以使用它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

原因在 FAQ 链接的要点中或多或少地解释了。基本上,当使用 创建解释器时getEngineByName("scala")java.class.path使用 并且它仅包含sbt-launch.jar. 使用技巧embeddedDefaults将类路径设置为正确的值(您可以检查settings调用之前和之后的embeddedDefaults)。

于 2014-06-22T13:21:54.570 回答