1

を呼び出すコードを含むosgiバンドルかどうか、誰でも明確に教えてもらえますか

javax.imageio.spi.ServiceRegistry

サービスの実装が別のバンドルにある場合、(META-INF\service 内の) サービスを検索すると、そのサービスが検索されます。

これについて具体的なドキュメントは見つかりません。私はfelix osgiコンテナを使用しています。どんな指摘もありがたく受け取るだろう。

xdocreport osgi bundlefr.opensagres.xdocreport.coreで、ここでServiceRegistry使用されていることに気付いたので、問題は別の場所にあると思いますが、すべての osgi コンテナでサポートされていない可能性がありますか?

4

4 に答える 4

0

そのままでは、OSGi はこれをサポートしていません。コードを少し調整する必要があります。しかし、Aries SPI Fly やPax-Swissboxなど、これらの SPI「サービス」の使用をサポートするツールがあります。

于 2012-10-02T06:42:26.587 に答える
0

こんにちは、皆さんの回答に感謝します。ServiceRegistry は osgi コンテナーでサービスをインスタンス化するために機能すると思いますが、同じクラスローダー内でのみです。これはosgi fragmentを使用することで容易になります。したがって、ServiceRegistry 検索コードを持つクラスを含むバンドルとして Fragment-host を定義するフラグメント内に実装者がいる限り、ServiceRegistry は機能します。

これが、リンク先の xdocreport コードで機能している理由です。この場合、ServiceLoader コードはfr.opensagres.xdocreport.core (バンドル) の抽象クラスから呼び出され、fr.opensagres.xdocreport.document の具象クラスによって拡張されます(したがって、ServiceRegistry 呼び出しは fr.opensagres. xdocreport.document)。サービスの実装はfr.opensagres.xdocreport.document.docxにあります。frament-host を fr.opensagres.xdocreport.document として定義したフラグメント。

したがって、fr.opensagres.xdocreport.document と fr.opensagres.xdocreport.document.docx は同じクラス ローダーを使用するため、機能します。

于 2012-10-10T22:30:56.647 に答える
0

XDocReport では、管理するモジュラー API レポートが必要でした:

  • あらゆる種類のドキュメント(docx、odt、pptx...)。また、必要に応じて独自のドキュメントの種類を実装し、javax.imageio.spi.ServiceRegistry を介して登録することもできます。
  • 任意のテンプレート エンジンの種類 (Freemarker、Velocity...)。また、必要に応じて独自のテンプレートの種類を実装し、javax.imageio.spi.ServiceRegistry を介して登録することもできます。
  • 任意のコンバーター タイプ (POI+iText を使用する docx->pdf コンバーター、POI を使用する docx->xhtml コンバーター、ODFDOM+iText を使用する odt->pdf コンバーター、ODFDOM を使用する odt->xhtml コンバーター...)。また、必要に応じて独自のコンバーターを実装し、javax.imageio.spi.ServiceRegistry を介して登録することもできます (例: docx->pdf コンバーターを docx4j+FOP で実装し、docx->pdf コンバーターを JODConverter で実装するなど)。

ご理解のとおり、javax.imageio.spi.ServiceRegistryは OSGi バンドルではなくOSGi フラグメント (同じクラスローダーを共有) を使用するため、OSGi コンテキストで動作します。非 OSGi コンテキストと OSGi コンテキストの両方を同じコードで管理するために、この選択を行いました。

以下の理由により、OSGi バンドルではなく OSGi フラグメントを使用することにしました。

  1. OSGi バンドルを使用する場合は、OSGi Activator を開発してディスカバリを登録する必要があります (このコンテキスト バンドルでは、javax.imageio.spi.ServiceRegistry は機能しません)。
  2. OSGi バンドルを使用する場合、検出を登録する各バンドルの開始レベルを構成する必要があります。

OSGi フラグメントを使用する唯一の欠点は、OSGi コンテナーで XDocReport テンプレート、コンバーター、ドキュメントの複数のバージョンを使用できないことです。しかし、それは XDocReport の優れた機能でしょうか?

javax.imageio.spi.ServiceRegistryが JDK5 (および JDK6) で動作することに注意してください。JDK6 では、javax.imageio.spi.ServiceRegistry としてサービスを登録するための新しいクラスであるjava.util.ServiceLoaderが提供されます。

XDocReport では、JDK5+JDK6 をサポートしたいと考えています。XDocReport 0.9.8 はjavax.imageio.spi.ServiceRegistryのみを使用していました。しかし、Google App Engine はこのクラスの使用を禁止しているようです (問題 132を参照)。そこで、JDK5 と JDK6 のjava.util.ServiceLoaderjavax.imageio.spi.ServiceRegistryの両方を Java リフレクションで管理するXDocReport 1.0.0 JDKServiceLoaderを開発しました。

よろしくアンジェロ

于 2012-10-11T12:10:10.603 に答える
0

いいえ、そうではありません。システム クラス ローダー内のサービスのみを検出するため、バンドルにはほとんど役に立たないと思います。

この投稿はかなり役に立ちますが、問題に役立つかどうかは疑問です。

また、OSGi 5 はそれをサポートします (「Service Loader Mediator」)。リファレンス実装は、Apache Aries の SPI Flyです。

于 2012-09-30T22:01:59.800 に答える