如何使用scala作为脚本语言设置jsr223脚本

到目前为止,我已经为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”的脚本的简单类名命名。 此外,该示例假定,为脚本评估传递的绑定包含名称“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(); } }