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.
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
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