質問

を含むコードを含むOSGiバンドルの場合は、誰かが確実に教えてください。

href="http://docs.oracle.com/javase/6/docs/api/javax/imageio/spi/serviceRegistry.html" rel="nofollow"> javax.imageio.spi.ServiceRegistry

サービスを見つける(Meta-Inf \ Serviceの)サービス実装が別のバンドルにある場合、そのサービスを見つけるでしょう。

これについて具体的な文書を見つけていません。私はFelix OSGiコンテナを使っています。どんなポインタも感謝しています。

私はそれが仕事や私の問題が他の場所であると思われると私はXDoCreport OSGi Bundle fr.opensagres.xdocreport.coreであることに気付くので、ServiceRegistryここ多分それはすべてのOSGIコンテナではサポートされていませんか?

役に立ちましたか?

解決 3

こんにちはあなたの答えのために誰もがいています。 私はServiceRegistryがサービスをインスタンス化するためにOSGiコンテナで機能するのではなく、同じクラスローダー内でのみ機能すると思います。 そしてそれは OSGiフラグメントを使用することによって促進されます。実装者が、サーバーレーストルックアップコードを持つクラスを含むバンドルとしてフラグメントホストを定義するフラグメント内にある限り、ServiceRegistryは機能します。

これがリンクされているXDocreportコードで機能している理由です。 この場合、ServiceLoaderコードは fr.opensagres.xdocreport.core (バンドル)。 fr.opensagres.xdocreport.document (ServiceRegistry呼び出しはfr.OpenSagres.xDocreport.document)です。サービス実装は fr.opensagres.xdocreport.document.docx 。そのフレームホストとしてfr.opensagres.xDocreport.Document

so fr.opensagres.xdocreport.documentとfr.opensagres.xdocreport.document.docxは同じクラスローダーを使用しています...それで機能します!

他のヒント

ボックス外のOSGIはこれをサポートしていないため、コードを少し微調整する必要があります。 しかし、Aries Spi Flyと pax-swissbox そのサポート君は これらのSPI「サービス」を使用する際の

いいえ、そうではありません。私はそれがシステムクラスローダーのサービスのみを発見するだけであるので、バンドルにはかなり無駄です。

回避策があるかもしれません post はかわいいですそれがあなたの問題に使用するのであれば疑いがありますが、役に立ちました。

OSGi 5はそれをサポートしています( 'Service Loader Mediator')。参照実装は Spi Fly Apache Aries です。

XDoCreportでは、管理するモジュラAPIレポートを持っていました:

  • 文書種類(docx、odt、pptx ...)。そして、あなたがjavax.imageio.spi.ServiceRegistryregistryを介して登録して登録した場合は、あなた自身の文書の種類を実装できます。
  • 任意のテンプレートエンジンの種類(FreeMarker、Velocity ...)。そして、javax.imageio.spi.ServiceRegistryregistryRegistryを介して登録して登録した場合は、独自のテンプレート種類を実装できます。
  • 任意のコンバータタイプ(POI + ITEXT、DOCX-> XHTMLコンバータ、ODFDOM + ITEXT、ODFDOM + XHTMLコンバータ、ODFDOM +> XHTMLコンバータ、ODFDOMを備えたDOCX-> XHTMLコンバータ...)。そして、javax.imageio.spi.ServiceRegistry(ex:docx4j + fop、docx-> pdfコンバータ、DOCx-> PDFコンバータなど、JodConverterなどのdocx-> PDFコンバータなど)を介して、独自のコンバータを実装できます。

    理解したように、 javax.imageio.spi.ServiceRegistryはOSGiのコンテキストで動作しますはOSGiフラグメントを使用し、OSGiバンドルではありません。同じコードを使用して、OSGi以外のOSGIコンテキストを管理するためにこの選択をしました。

    OSGiバンドルではなくOSGiフラグメントを使用することを決定しました:

    1. OSGiバンドルを使用する場合は、私たちの発見を登録するOSGi Activatorを開発する必要があります(このコンテキストバンドル、javax.imageio.spi.ServeRegistryは機能しません)。
    2. OSGiバンドルを使用する場合は、検出を登録する各バンドルの開始レベルを設定する必要があります。

      OSGiフラグメントを使用することの唯一の唯一の障害は、XDoCreportテンプレートのいくつかのバージョン、コンバータ、ドキュメントのいくつかのバージョンでは使用できないことです。しかし、それはXDocreportのための良い機能ですか?

      javax.imageio.spi.ServiceRegistry はJDK5(およびJDK6)で動作してはなりません。 JDK6は、Regsiter Servicesへの新しいCLASをjavax.imageio.spi.ServiceRegistryRegistryに提供する java.util.ServiceLoader を提供します。

      XDoCreportでは、JDK5 + JDK6をサポートしています。 XDoCreport 0.9.8は javax.imageio.spi.ServiceRegistry のみを使用しました。しかし、Google App Engineはこのクラスの使用を禁止するようです(問題132 )だから私はXDoCreport 1.0.0 jdkserviceLoader java.util.ServiceLoader javax.imageio.spiの両方でJava Reflectionを使用して管理する。保守系 JDK5とJDK6の場合は

      Angelo を尊重します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top