2016-05-03 24 views
0

Ich habe einige benutzerdefinierte Logik, wo ich einen einfachen booleschen Ausdruck bewerten muss. In meiner IDE habe ich einige Unit-Tests, die gut laufen, aber wenn ich versuche, es auf meiner CQ 5.6.1-Instanz zu verwenden, kann die ScriptEngineManager keine JavaScript-Engine finden. Dies sollte jedoch Teil einer Standard-Java-Installation in jeder Umgebung sein.Wie kann ich Rhino (oder eine andere JavaScript Engine) in CQ 5.6 aktivieren?

ScriptEngineManager sef = new ScriptEngineManager(); 
ScriptEngine se = sef.getEngineByName("JavaScript"); 

Im pom habe ich die folgenden, die in der Regel hilft:

<Import-Package>*;resolution:=optional</Import-Package> 

Normalerweise werden einige Systembibliotheken sind nicht in OSGi ausgesetzt, wenn Sie es nicht in der sling.properties in die bootdelegation platziere, aber das hat auch nicht funktioniert:

org.osgi.framework.bootdelegation=org.w3c.*,com.sun.script.*,com.yourkit.*, ${org.apache.sling.launcher.bootdelegation} 

Was könnte ich noch versuchen?

EDIT: Auch in Bezug auf meinen Kommentar zu Christen beantworten. Ich fand heraus, dass es ein Dienst in der OSGi sein sollte: http://svn.apache.org/repos/asf/sling/trunk/bundles/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineFactory.java

Aber wenn ich versuche es mit dem folgenden Code zu verweisen, mein Servlet ist nicht mehr aktiv:

@Reference 
private transient ScriptEngineFactory sef = null; 

So scheint es, es kann die Fabrik aus irgendeinem Grund nicht spritzen. Ich habe gesehen, dass es mehr als einen Service geben könnte, der diese Schnittstelle implementiert, wie würde ich das richtige Ziel (oben verlinkt) ansprechen?

EDIT2: Ich versuchte nun auch direkt die Rhino Fabrik zu verweisen:

@Reference(target = "(component.name=org.apache.sling.scripting.javascript.internal.RhinoJavaScriptEngineFactory)") 
private transient ScriptEngineFactory sef = null; 

das mit meinem Servlet mir sagt, es ist zufrieden:

["Satisfied","Service Name: javax.script.ScriptEngineFactory","Target Filter: (component.name=org.apache.sling.scripting.javascript.internal.RhinoJavaScriptEngineFactory)","Multiple: single","Optional: mandatory","Policy: static","Bound Service ID 2004 (org.apache.sling.scripting.javascript.internal.RhinoJavaScriptEngineFactory)"] 

Aber wenn ich meine Servlet zugreifen Es wird nicht ausgelöst und das SlingDefaultServlet übernimmt. Ohne die oben genannten @Reference ist es zugänglich, also muss es damit etwas anfangen.

Antwort

0

Nach fast einem ganzen Tag von Versuch und Irrtum gefunden: 2 große Probleme:

Erstens: Meine Compiler-Plugin wurde eingestellt 1.8 zu verwenden; Ich hatte das so auf 1,6 zurückzukehren meine maven-scr-plugin würde wieder richtige Manifeste schaffen und die Injektion von OSGi-Service tatsächlich funktioniert:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <configuration> 
     <source>1.6</source> 
     <target>1.6</target> 
     <encoding>UTF-8</encoding> 
    </configuration> 
</plugin> 

Ich habe später zu untersuchen, wie es möglich wäre, dass auf mindestens 1,7 zu ​​erhöhen (Ich habe versucht, aber hat auch nicht funktioniert).

Zweite und die eigentliche Antwort auf meine Frage ist einfach:

@Reference 
private transient ScriptEngineManager sem = null; 

Auch hatte ich vom Manager javascript statt JavaScript für die getEngineByName Methode zu verwenden.Um zu sehen, was für den Motor registriert ist, können Sie den folgenden Pfad in Ihrer OSGi-Konsole finden Sie unter:

/system/console/status-slingscripting 

Dort werden alle verfügbaren ScriptEngine werden mit ihrem eingetragenen Namen, Erweiterungen und MIME-Typen.

1

Sie benötigen einen OSGi-fähigen ScriptEngineManager. Siehe https://devnotesblog.wordpress.com/2011/09/07/scripting-using-jsr-223-in-an-osgi-environment/

+0

danke, obwohl ich herausgefunden habe, dass es in diesem Fall eine von org.apache.sling.scripting.javascript geben sollte, aber immer noch keinen Erfolg. Ich habe diese Abhängigkeit sogar explizit zu meiner pom.xml hinzugefügt – Thomas

+0

Ich habe es mit den Klassen im Blog-Eintrag versucht, aber jetzt beklagen sie, dass sie BundleContext in findFactoryCandidates nicht kennen: org.apache.sling.engine.impl.SlingRequestProcessorImpl Dienst: Uncaught Throwable java.lang.NoClassDefFoundError: org/osgi/framework/BundleContext – Thomas