5

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

SBT FAQ によると、 a で何らかの魔法をかけてSettingsから、それを myInterpreterのコンストラクターに渡すことになっています。ただし、私は を直接作成しているわけではありませんInterpreter(また、エンジン オブジェクトが であるため、間接的に作成しているかどうかも明確ではありませんIMain)。

ScalaScriptEngineを SBT コンソールで動作させる方法はありますか?

4

1 に答える 1

5

エンジンを にキャストするscala.tools.nsc.interpreter.IMainと、 へのアクセスが可能になりsettingsます。次に、FAQ で言及されているように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 に答える