2012-01-05 8 views
1

私はosgiバンドルを作成しました。ここでは、(META_inf/services /の下で)サービスプロバイダを含むjar(bsf-all.jar)の依存関係があります。私は、OSGiコンソールを経由して私のバンドル状態をチェックするとサービスプロバイダとOSGIの問題

bsh.engine.BshScriptEngineFactory 
com.sun.script.freemarker.FreeMarkerScriptEngineFactory 
com.sun.script.groovy.GroovyScriptEngineFactory 
com.sun.script.jacl.JaclScriptEngineFactory 
com.sun.script.jaskell.JaskellScriptEngineFactory 
com.sun.script.java.JavaScriptEngineFactory 
com.sun.phobos.script.javascript.RhinoScriptEngineFactory 
com.sun.phobos.script.javascript.EmbeddedRhinoScriptEngineFactory 
com.sun.script.jawk.JawkScriptEngineFactory 
com.sun.script.jelly.JellyScriptEngineFactory 
com.sun.script.jep.JepScriptEngineFactory 
com.sun.script.jexl.JexlScriptEngineFactory 
com.sun.script.jruby.JRubyScriptEngineFactory 
com.sun.script.judo.JudoScriptEngineFactory 
com.sun.script.juel.JuelScriptEngineFactory 
com.sun.script.jython.JythonScriptEngineFactory 
com.sun.script.ognl.OgnlScriptEngineFactory 
org.pnuts.scriptapi.PnutsScriptEngineFactory 
com.sun.script.scheme.SchemeScriptEngineFactory 
com.sun.script.velocity.VelocityScriptEngineFactory 
com.sun.script.xpath.XPathScriptEngineFactory 
com.sun.script.xslt.XSLTScriptEngineFactory 

、「 サーバがスローそれがアクティブで、何の任意の依存関係の問題.. はありませんが、私はそれを使用しようとすると、(サーバー稼働して後を意味します)クラスが見つかりません "問題。

java.lang.ClassNotFoundException: com.sun.phobos.script.javascript.RhinoScriptEngineFactory 

この特定のクラスは、私の依存関係ジャー(BSF-all.jarを)であり、そのクラスは、サービスプロバイダを介して公開された。.. 私は、OSGiとJavaのサービスプロバイダとクラスローディング問題がある疑いがあります..

私のpom.xmlは次のとおりです。

<dependencies> 
     <dependency> 
      <groupId>org.apache.bsf</groupId> 
      <artifactId>bsf-all</artifactId> 
      <version>${bsf.version}</version> 
      <optional>true</optional> 
     </dependency> 
    <dependency> 
      <groupId>rhino</groupId> 
      <artifactId>js</artifactId> 
      <version>1.6R7</version> 
      <optional>true</optional> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.felix</groupId> 
       <artifactId>maven-bundle-plugin</artifactId> 

       <extensions>true</extensions> 
       <configuration> 
        <instructions> 
         <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> 
         <Bundle-Name>${project.artifactId}</Bundle-Name> 
         <Export-Package> 
          org.apache.bsf.*, 
          org.mozilla.javascript.*, 
          org.pnuts.scriptapi.*, 
          com.sun.script.*, 
          com.sun.phobos.script.*, 
          bsh.engine.*, 
          javax.script.*, 
         </Export-Package> 
         <Import-Package> 
          com.sun.*       
         </Import-Package> 
      <DynamicImport-Package>*</DynamicImport-Package> 
      <Embed-Dependency>js;scope=compile|runtime;inline=false;</Embed-Dependency> 
        </instructions> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

私はEquinox OSGiの実装を使用しています。上記の問題を解決するために私のPOMを編集できますか?

+0

はbsf-all.jarのOSGiバンドルです(意味:META-INF/MANIFEST.MFファイルを持っています)? – thobens

+1

サービスプロバイダはOSGiでは動作しませんが、スクリプトエンジンを手動で設定することでこれらのスクリプトエンジンを使用できます。ScriptEngineFactory.registerEngineName(String name) - 一度に依存関係を取得しようとする方が良いでしょう。また、すべてを埋め込むのではなく、個々のJarとしてラップしてください(つまり、個々の依存関係をバンドルにする場合は、pax-wrapを参照してください)。 – earcam

+0

"サービスプロバイダはOSGiでは動作しませんが、ScriptEngineFactory.registerEngineName(文字列名)を手動で設定することで、これらのスクリプトエンジンを使用できます。" ..マニュアル登録は正常に動作します。 – Ratha

答えて

4

このPOMには、CNFEの原因について推測を開始するにはあまりにも多くの根本的な誤りがあると感じます。あなたの<Export-Package>ステートメントは、最も懸念されています。なぜあなたは、バンドルの中にBSF、Rhino、Phobos、さらにはJDKの一部を再パッケージ化してエクスポートするのですか?

あなたの以前の質問に対する私の答えには、あなたが高レベルで達成しようとしていることをよく理解していない限り、あなたは低レベルの詳細でうんざりしています。したがって、誰かがこの特定の問題を過ぎ去らせる回答を投稿したとしても、あなたはまだ実用的なアーキテクチャを持っていません。

達成したいこととその理由を高水準で説明してください。次に、優れたOSGiプラクティスに基づいたソリューションを提供することができます。

+0

私は理解しています。私の場合、エクスポートされたパッケージはバックエンドで必要となります(エクスポートされたパッケージは依存関係のジャーで定義されています(つまり:bsf -all.jar).So、明示的にそれらをエクスポートしようとすると、他のバンドルにアクセスするようになります。間違っていますか? – Ratha

関連する問題