Как настроить сценарии jsr223 с использованием scala в качестве языка сценариев - PullRequest
7 голосов
/ 13 апреля 2011

До сих пор я пробовал реализацию sling для сценариев jsr223 для scala, но не смог правильно ее настроить.когда я делаю это:

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-current-ClassLoader-вместо-на-основе-строки-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

возможно, есть другая реализация, о которой я не знаю.

Любая помощь приветствуется

Ответы [ 3 ]

6 голосов
/ 14 апреля 2011

Посмотрите на тестовые примеры в модуле scala / script Apache Sling для рабочего примера.Сценарий и его точка входа (то есть объект) должны следовать определенным соглашениям.Более подробную информацию об этих механизмах я предоставлю позже.

Общий обзор механизма сценариев см. В слайдах моей сессии из Scala Days 2010 .

.Обновление: Сценарии должны иметь следующую форму:

package my.cool.script {
  class foo(args: fooArgs) {
    import args._ // import the bindings
    println("bar:" + bar)
  }
}

Тип args - это , сгенерированный механизмом сценариев и названный в честь простого имени классаСценарий дополнен «Арги».Кроме того, в примере предполагается, что Bindings , переданные для оценки скрипта, содержат значение для имени 'bar'.Для получения дополнительной информации см. Комментарий к классу ScalaScriptEngine.

Вам необходимо передать имя вашего класса сценария в обработчик сценариев.Вы делаете это, помещая полное имя скрипта (то есть my.cool.script.foo) в ScriptContext с именем scala.script.class.

4 голосов
/ 02 июня 2013

С выводом 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();
}
0 голосов
/ 22 октября 2013

К сожалению, мой комментарий невозможно было прочитать без разрывов строк - так что ...

Чтобы запустить упомянутый 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();
  }
}
...