我有一些自定义逻辑,我需要评估一个简单的布尔表达式。在我的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
,则可以访问它,因此必须对其进行操作。
答案 0 :(得分:1)
您需要一个支持OSGi的ScriptEngineManager。见https://devnotesblog.wordpress.com/2011/09/07/scripting-using-jsr-223-in-an-osgi-environment/
答案 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类型。