gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:21:28 25 4
gpt4 key购买 nike

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

According to the SBT FAQ ,我应该使用 Settings 做一些魔法,然后将其传递到我的 Interpreter 的构造函数中。但是,我并没有直接创建一个 Interpreter(甚至不清楚我是否间接创建它,因为引擎对象是一个 IMain)。

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

最佳答案

您可以将引擎转换到 scala.tools.nsc.interpreter.IMain ,这将使您可以访问 settings 。然后你可以使用embeddedDefaults将类路径设置为 it was mentioned in the FAQ 。只需在调用 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

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

关于scala - 如何使用 JSR-223 在 sbt 控制台中获取 Scala 解释器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23961092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com