7

到目前为止,我已经尝试了 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

也许还有另一个我不知道的实现。

任何帮助表示赞赏

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”命名。此外,该示例假设,为脚本评估传递的绑定包含名称“bar”的值。有关更多详细信息,请参阅 上的类评论ScalaScriptEngine

您需要将脚本类的名称传递给脚本引擎。为此,您可以将完全限定的脚本名称(即my.cool.script.foo)放入ScriptContext名为“scala.script.class”的文件中。

于 2011-04-13T22:34:36.040 回答
4

随着https://issues.scala-lang.org/browse/SI-874在 2.11 版本中的结束,它应该和票证中显示的一样简单:

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 回答
0

不幸的是,如果没有换行符,我的评论就无法阅读 - 所以......

为了能够运行提到的 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();
  }
}
于 2013-10-22T08:51:36.923 回答