2016-05-03 7 views
0

私は単純なブール式を評価する必要のあるカスタムロジックを持っています。私のIDEではうまく動作するいくつかの単体テストがありますが、CQ 5.6.1インスタンスで使用しようとすると、ScriptEngineManagerはJavaScriptエンジンを見つけることができません。これは、どの環境でも標準的なJavaインストールの一部でなければなりません。私は通常助け以下持ってポンポンでCQ 5.6でRhino(またはJavaScriptエンジン)を有効にする方法は?

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

<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

しかし、私は次のコードでそれを参照しようとすると、私のサーブレットは、もはや有効ではありません。

@Reference 
private transient ScriptEngineFactory sef = null; 

だから、それを思わ何らかの理由で工場に注入できません。このインターフェイスを実装するサービスが複数ある可能性があることがわかりました。

EDIT2:私のサーブレットは、それが満たされていると言われます。これにより

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

:私は今でも直接Rhinoの工場を参照しようとしました

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

しかし、私は私のサーブレットにアクセスする場合トリガされず、SlingDefaultServletが引き継ぎます。上記の@Referenceがなければ、アクセス可能ですので、何かをしなければなりません。

答えて

0

を参照してください、私は2つの主要な問題を発見した:

まず:私のコンパイラプラグインは1.8を使用するように設定しました。私は少なくとも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> 

(私が試した:私は私のmaven-scr-pluginが再び適切なマニフェストを作成しますとOSGiサービスの注入が実際に動作1.6にそれを元に戻す必要がありましたいずれも動作しませんでした)。

第二に、私の質問に対する実際の答えは簡単です:

@Reference 
private transient ScriptEngineManager sem = null; 

はまた、私はマネージャーからのgetEngineByName方法のためjavascriptの代わりJavaScriptを使用する必要がありました。エンジンのために登録されているかを確認するには、あなたのOSGiコンソールで次のパスをチェックアウトすることができます:

あり
/system/console/status-slingscripting 

使用可能なすべてのScriptEngineは、その登録名、拡張子とMIMEタイプで記載されています。

1

OSGi対応のScriptEngineManagerが必要です。試行錯誤のほぼ全域日を過ごした後https://devnotesblog.wordpress.com/2011/09/07/scripting-using-jsr-223-in-an-osgi-environment/

+0

ありがとう、私は、org.apache.sling.scripting.javascriptがこの場合に利用できるはずだが、まだ成功していないことを知ったが、感謝した。私はこの依存関係を明示的にpom.xmlに追加しました – Thomas

+0

ブログの項目で提供されたクラスで試してみましたが、今はfindFactoryCandidatesのBundleContextを知らないと不平を言っています: org.apache.sling.engine.impl.SlingRequestProcessorImplサービス:Uncaught Throwable java.lang.NoClassDefFoundError:org/osgi/framework/BundleContext – Thomas

関連する問題