簡體   English   中英

如何使用scala作為腳本語言設置jsr223腳本

[英]How do I set up jsr223 scripting with scala as scripting language

到目前為止,我已經為scala嘗試了jsr223腳本的sling實現,但是無法正確設置它。 當我這樣做:

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)

類似的問題在這里討論: http//scala-programming-language.1934581.n4.nabble.com/How-to-compile-Scala-code-from-java-using-the-current-ClassLoader-instead-of-一個字符串為基礎,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

也許還有另一個我不知道的實現。

任何幫助贊賞

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上的類注釋。

您需要將腳本類的名稱傳遞給腳本引擎。 您可以通過將名稱為“scala.script.class”的完全限定腳本名稱(即my.cool.script.foo )放入ScriptContext來完成此操作。

隨着版本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();
}

不幸的是,我的評論在沒有換行的情況下是不可讀的 - 所以......

為了能夠運行提到的Codesnippet,我需要進行以下更改。 我用過Scala 2.11.0-M4

public static void main(String args[]){
  ScriptEngine engine = new ScriptEngineManager().getEngineByName("scala");

  // Set up Scriptenvironment to use the Java classpath
  List nil = Nil$.MODULE$;
  $colon$colon vals = $colon$colon$.MODULE$.apply((String) "true", nil);
  ((IMain)engine).settings().usejavacp().tryToSet(vals);ScriptContext.ENGINE_SCOPE);

  engine.getContext().setAttribute("labelO", new Integer(4), ScriptContext.ENGINE_SCOPE);
  try {
    engine.eval("val label = labelO.asInstanceOf[Integer]\n"+
                "println(\"ergebnis: \" + (2 + label ))");
  } catch (ScriptException ex) {
    ex.printStackTrace();
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM