如何使用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之前和之后检查设置). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |