7

これまでのところ、scala 用の jsr223 スクリプトのスリング実装を試しましたが、正しくセットアップできませんでした。私がこれを行うとき:

public static void main(String[] args) {
    try {
        new ScriptEngineManager().getEngineByName("scala").
          eval("object HelloWorld {def main(args: Array[String]) { 
                  println(\"Hello, world!\") }}");
    } catch (ScriptException e) {
        e.printStackTrace();
    }
}

私は何も得ませんでした:

javax.script.ScriptException: ERROR 
org.apache.sling.scripting.scala.Script line 13 : not found: type 
Script at org.apache.sling.scripting.scala.ScalaScriptEngine.eval(ScalaScriptEngine.scala:117)
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247)

同様の問題がここで議論されています : a-string-based-classpat-td1955873.html#a1955873

http://dev.day.com/discussion-groups/content/lists/sling-dev/2009-12/2009-12-01_Scala_scripting_support_was_Re_And_another_one____Michael_D_rig.html

私が気付いていない別の実装があるかもしれません。

どんな助けでも大歓迎

4

3 に答える 3

6

実際の例については、Apache Slingの scala/script モジュールのテスト ケースをご覧ください。スクリプトとそのエントリ ポイント (オブジェクト) は、特定の規則に従う必要があります。これらについては、必要に応じて後で詳しく説明します。

スクリプト エンジンの概要については、Scala Days 2010 の私のセッション スライドを参照してください。

更新:スクリプトは次の形式である必要があります。

package my.cool.script {
  class foo(args: fooArgs) {
    import args._ // import the bindings
    println("bar:" + bar)
  }
}

の型はargsスクリプトエンジンによって生成され、スクリプトの単純なクラス名に「Args」を追加した名前が付けられます。さらに、この例では、スクリプト評価のために渡されたBindingsに「bar」という名前の値が含まれていると想定しています。詳細については、 のクラス コメントを参照してくださいScalaScriptEngine

スクリプト クラスの名前をスクリプト エンジンに渡す必要があります。これを行うには、完全修飾スクリプト名 (つまりmy.cool.script.foo) をScriptContext「scala.script.class」という名前で に入れます。

于 2011-04-13T22:34:36.040 に答える
4

バージョン 2.11 のhttps://issues.scala-lang.org/browse/SI-874の結論により、チケットに示されているのと同じくらい簡単なはずです。

import javax.script.*;
ScriptEngine e = new ScriptEngineManager().getEngineByName("scala");
e.getContext().setAttribute("label", new Integer(4), ScriptContext.ENGINE_SCOPE);
try {
    engine.eval("println(2+label)");
} catch (ScriptException ex) {
    ex.printStackTrace();
}
于 2013-06-02T14:40:59.147 に答える