Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用scala作为脚本语言设置jsr223脚本_Java_Scala_Scripting Language_Jsr223 - Fatal编程技术网

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

Java 如何使用scala作为脚本语言设置jsr223脚本,java,scala,scripting-language,jsr223,Java,Scala,Scripting Language,Jsr223,到目前为止,我已经尝试了针对scala的jsr223脚本的sling实现,但无法正确设置它。 当我这样做时: public static void main(String[] args) { try { new ScriptEngineManager().getEngineByName("scala"). eval("object HelloWorld {def main(args: Array[String]) {

到目前为止,我已经尝试了针对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)
这里讨论了类似的问题:

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


感谢您提供的任何帮助

请查看的scala/script模块中的测试用例,以获得一个工作示例。脚本及其入口点(即对象)需要遵循某些约定。如果以后需要,我将提供更多关于这些的信息

有关脚本引擎的概述,请参阅

更新:脚本必须采用以下形式:

package my.cool.script {
  class foo(args: fooArgs) {
    import args._ // import the bindings
    println("bar:" + bar)
  }
}
args
的类型是,并且是以脚本的简单类名加上“args”命名的。此外,该示例假设passed for脚本求值包含名称“bar”的值。有关更多详细信息,请参阅上的类注释

您需要将脚本类的名称传递给脚本引擎。您可以通过将完全限定的脚本名(即my.cool.script.foo)放入名为“scala.script.class”的脚本中来实现这一点

根据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();
}

不幸的是,如果没有换行符,我的评论是不可读的-所以

为了能够运行前面提到的代码片段,我需要做以下更改。 我使用了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();
  }
}

对于当前的Scala版本2.11.0-M4,需要做一些额外的工作来配置环境以使用java类路径:。。。列表nil=nil$.MODULE$$冒号$colon VAL=$colon$colon$.MODULE$.apply((字符串)“true”,无);((IMain)引擎).settings().usejavacp().tryToSet(VAL);备注:当前里程碑2.11.0-M5有一个错误,并为getEngineByName(“scala”)返回NULL。M6应该可以工作(我还没有测试)