加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:26:00 所属栏目:安全 来源:网络整理
导读:在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@
在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的构造函数.但是,我不是直接创建一个解释器(如果我间接创建它,它甚至不清楚,因为引擎对象是一个IMain).

Scala ScriptEngine是否有某种方法可以在SBT控制台上运行?

解决方法

您可以将引擎转换为scala.tools.nsc.interpreter.IMain,这样您就可以访问这些设置.然后,您可以使用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的技巧将类路径设置为正确的值(您可以在调用embeddedDefaults之前和之后检查设置).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读