[英]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
和
也許還有另一個我不知道的實現。
任何幫助贊賞
在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.