War es hilfreich?

Lösung 3

hi danke jedem für Ihre Antworten. Ich denke, das Serviceregiegietie wird in einem OSGI-Container arbeiten, um einen Service zu instanziieren, jedoch nur innerhalb desselben Klassenladers. Und das ist durch die Verwendung von Osgi-Fragmente erleichtert. Solange der Implementierer in einem Fragment ist, das seinen Fragment-Host als Bündel definiert, das die Klasse enthält, die den Serviceregistry-Lookup-Code enthält, funktioniert das ServicereGiege.

Deshalb arbeitet es in dem XDocreport-Code, mit dem ich verbunden bin. In diesem Fall wird der Serviceloader-Code aus einer abstrakten Klasse in fr.openagres.xdocreport.core (ein Bündel), das von verlängert wird Betonklasse in fr.opensagres.xdocreport.document (so ist der Anruf des Serviceregistry in Fr.OpenSagres.xDocreport.Document). Die Service-Implementierung ist in fr.openagres.xdocreport.document.docx . ein Fragment, dessen Seine fraß-host als fr.openagres.xdocreport.document .

so fr.openagres.xdocreport.document and fr.openagres.xDocReport.document.docx Verwenden Sie denselben Klasse Loader ... also funktioniert es!

Andere Tipps

Aus der Box unterstützt Osgi dies nicht, Sie müssen Ihren Code ein bisschen optimieren. Es gibt jedoch Tools in der Nähe, wie Aries SPI FLY und pax-swissbox diese UnterstützungSie Bei der Verwendung dieser SPI "Services"

nein, das ist nicht.Ich denke, es wird nur Dienste im Systemklassenloader entdecken, so dass für Bündel ziemlich nutzlos ist.

Es könnte eine Problemumgehung geben, dies post ist hübschhilfreich, obwohl ich zweifle, wenn es von irgendeiner Verwendung für Ihr Problem ist.

Auch OSGI 5 hat Unterstützung dafür ('Service Loader Mediator').Die Referenzimplementierung ist spi fliege von Apache ARIES

In XDocreport wollten wir ein modulares API-Berichtswesen zum Management haben:

  • jegliches dokument art (docx, odt, pptx ...). Und Sie können Ihre eigene Dokument-Art umsetzen, wenn Sie es über javax.imageio.spi.ServiceRegistry wünschen und registrieren.
  • Jede Template-Engine-Art (Freemarker, Geschwindigkeit ...). Und Sie können Ihre eigene Vorlage-Art implementieren, wenn Sie es über javax.imageio.spi.ServiceRegistry wünschen und registrieren.
  • jeder Konvertertyp (Docx-> PDF-Wandler mit POI + ITEXT, docx-> XHTML-Konverter mit POI, ODT-> PDF-Wandler mit ODFDOM + ITEXT, ODT-> XHTML-Konverter mit ODFDOM ...). Und Sie können Ihren eigenen Konverter implementieren, wenn Sie es über javax.imageio.spi.serviceegistry (EX: Implementieren von DocX-> PDF-Wandler mit DOCX4J + FOP, DOCX-> PDF-Konverter mit Jodconverter usw.) umsetzen.

    Wie Sie verstanden haben, funktioniert javax.imageio.spi.serviceegistry auf Osgi-Kontext weil wir osgi-Fragment verwenden (teilen Sie den gleichen Klassifloader) und kein Osgi-Bundle. Wir haben diese Wahl getan, um Nicht-Osgi- und Osgi-Kontext sowohl mit demselben Code zu verwalten.

    Wir haben uns entschieden, Osgi-Fragment und kein Osgi-Bündel zu verwenden, da:

      .
    1. Wenn wir Osgi-Bundle verwenden, müssen wir einen OSGI-Aktivator entwickeln, um unsere Entdeckung zu registrieren (in diesem Kontextbündel javax.imageio.spi.Serviceegistry funktioniert nicht).
    2. Wenn wir OSGI-Bundle verwenden, müssen Sie die Startebene für jede Bündel konfigurieren, die die Entdeckung registrieren.

      Die einzige Disavstelle, um OSGI-Fragment zu verwenden, ist, dass Sie in Ihrem OSGI-Container mehrere Version von XDoCreport-Vorlagen, Konverter, Dokument nicht verwenden können. Aber ist es ein gutes Merkmal für Xdocreport?

      Sie dürfen nicht das javax.imageio.spi.serserviceegistry arbeitet mit JDK5 (und JDK6). JDK6 bietet java.util.serviceloader , was neue Clas für Regsiter-Dienste wie Javax.imageio.spi.ServiceRegistry ist.

      In Xdocreport möchten wir JDK5 + JDK6 unterstützen. XDocreport 0.9.8 verwendet nur javax.imageio.spi.serviceegistry . Es scheint jedoch, dass Google App-Motor die Verwendung dieser Klasse verbietet (siehe unseren Ausgabe 132 ). Also habe ich für xdocreport 1.0.0 JDKServiceLoader , um mit Java-Reflexion sowohl java.util.serviceloader und javax.imageio.spi zu verwalten .ServiceGiege für JDK5 und JDK6.

      Grüße Angelo

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top