如何在CQ 5.6中启用Rhino(或任何JavaScript引擎)?

时间:2016-05-03 14:25:35

标签: osgi cq5 rhino

我有一些自定义逻辑,我需要评估一个简单的布尔表达式。在我的IDE中,我有一些运行良好的单元测试,但是当我尝试在我的CQ 5.6.1实例上使用它时,ScriptEngineManager找不到JavaScript引擎。虽然这应该是任何环境中标准Java安装的一部分。

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

在pom中我有以下通常有帮助:

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

通常,当您没有将某些系统库放入sling.properties的bootdelegation中时,它们不会在OSGi中公开,但这也不起作用:

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

我还能尝试什么?

修改 还有关于我对基督徒的评论答案。我发现OSGi中应该有一个服务: http://svn.apache.org/repos/asf/sling/trunk/bundles/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineFactory.java

但是当我尝试使用以下代码引用它时,我的servlet不再处于活动状态:

@Reference
private transient ScriptEngineFactory sef = null;

所以似乎不能出于某种原因注入工厂。我已经看到可能有多个服务实现此接口,我将如何定位正确的(上面链接)?

EDIT2: 我现在甚至试图直接引用Rhino工厂:

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

有了这个,我的servlet告诉我它满意:

["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)"]

但是,如果我访问我的servlet,它不会被触发,SlingDefaultServlet接管。如果没有上述@Reference,则可以访问它,因此必须对其进行操作。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

经过近一整天的反复试验,我发现了两个主要问题:

首先:我的编译器插件设置为使用1.8;我不得不将其恢复为1.6,因此我的final Pattern pattern = Pattern.compile("From (.+?) icmp_seq="); final Matcher matcher = pattern.matcher(output); matcher.find(); Log.wtf(iLinkLog, "Process output"+matcher.group(1)); 将再次创建适当的清单,并且注入OSGi服务实际上有效:

maven-scr-plugin

我必须稍后调查如何将其增加到至少1.7(我试过但也没有用)。

其次,我的问题的实际答案很简单:

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

此外,我必须使用@Reference private transient ScriptEngineManager sem = null; 代替javascript来获取经理的JavaScript方法。要查看为引擎注册的内容,可以在OSGi控制台中查看以下路径:

getEngineByName

列出了所有可用的/system/console/status-slingscripting 及其注册名称,扩展名和MIME类型。