到目前为止,我已尝试使用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)
和
也许还有另一个我不知道的实现。
任何帮助表示赞赏
答案 0 :(得分:6)
查看Apache Sling的scala / script模块中的测试用例以获取工作示例。脚本及其入口点(即对象)需要遵循某些约定。如果以后需要,我会提供更多相关信息。
有关脚本引擎的一般概述,请参阅my session slides from Scala Days 2010。
更新:脚本必须采用以下格式:
package my.cool.script {
class foo(args: fooArgs) {
import args._ // import the bindings
println("bar:" + bar)
}
}
args
的类型是generated by the script engine,并以附加“Args”的脚本的简单类名命名。此外,该示例假定,为脚本评估传递的Bindings包含名称“bar”的值。有关详细信息,请参阅ScalaScriptEngine
上的课程评论。
您需要将脚本类的名称传递给脚本引擎。您可以通过将名称为“scala.script.class”的完全限定脚本名称(即my.cool.script.foo
)放入ScriptContext
来完成此操作。
答案 1 :(得分: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();
}
答案 2 :(得分:0)
不幸的是,我的评论在没有换行的情况下是不可读的 - 停止>
为了能够运行提到的代码片段,我需要进行以下更改。 我用过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();
}
}