سؤال

هل يمكن لأحد أن يخبرني بشكل قاطع ما إذا كانت حزمة osgi تحتوي على رمز يستدعي

javax.imageio.spi.ServiceRegistry

للعثور على خدمة (في META-INF\service) سيجد تلك الخدمة، إذا كان تطبيق هذه الخدمة موجودًا في حزمة أخرى.

لم أجد أي وثائق محددة حول هذا الأمر.أنا أستخدم حاوية felix osgi.سيتم تلقي أي مؤشرات بامتنان.

أظن أنه يعمل وأن مشكلتي تكمن في مكان آخر حيث لاحظت ذلك في حزمة xdocreport osgi fr.opensagres.xdocreport.core, ServiceRegistry يعتاد هنا ولكن ربما لا يكون مدعومًا في جميع حاويات osgi؟

هل كانت مفيدة؟

المحلول 3

مرحبا، شكرا للجميع على إجاباتك. أعتقد أن Serviceregistry ستعمل في حاوية OSGI لإرساء الخدمة ولكن فقط داخل نفس النطاق. وهذا سهل الاستخدام باستخدام شظايا OSGI . طالما أن المنفذ في جزء يعرف مضيفه المضيف كحزمة تحتوي على فئة تحتوي على رمز بحث Serviceregistry، فستعمل Serviceregistry.

هذا هو السبب في أنه يعمل في رمز XDocReport الذي ربطته. في هذه الحالة، يتم استدعاء رمز ServiceLoader من فئة مجردة في fr.opensagres.xdocreport.core (حزمة)، التي تمددها فئة ملموسة في fr.opensagres.xdocreport.document (إذن مكالمة Serviceregistry موجودة في fr.opensagres.xdocreport.document). تطبيق الخدمة في fr.opensagres.xdocreport.document.docx . شظية حددها مضيف frament-host as fr.opensagres.xdocreport.document .

so fr.opensagres.xdocreport.document and fr.opensagres.xdocreport.document استخدم نفس محمل الفئة ... لذلك يعمل!

نصائح أخرى

خارج الصندوق، لا يدعم OSGI هذا، ستحتاج إلى تعديل التعليمات البرمجية الخاصة بك قليلا. ولكن هناك أدوات حول مثل ARIES SpI Fly و Pax-swissbox هذا الدعمأنت في استخدام هذه SPI "الخدمات"

لا، هذا لا.أعتقد أنه سيكتشف فقط الخدمات في محمل فئة النظام، بحيث يكون ذلك عديمة الفائدة إلى حد كبير للحزم.

قد يكون هناك حل بديل، هذا منشور هو جميلمفيدا، على الرغم من أنني أشك في أنه إذا كان من أي استخدام لمشكلتك.

أيضا OSGI 5 سيكون لها دعم له ("خدمة محمل الخدمة").التنفيذ المرجعي هو SPI FLOS من Apache Aries

في XDocReport أردنا الحصول على ملف تقارير API المعيارية لإدارة :

  • أي نوع الوثيقة (دوكإكس، أود، بي بي تي إكس ...).ويمكنك تنفيذ نوع المستند الخاص بك إذا كنت ترغب في ذلك وتسجيله عبر javax.imageio.spi.ServiceRegistry.
  • أي نوع محرك قالب (Freemarker، السرعة...).ويمكنك تنفيذ نوع القالب الخاص بك إذا كنت ترغب في ذلك وتسجيله عبر javax.imageio.spi.ServiceRegistry.
  • أي نوع محول (docx->محول pdf مع POI+iText، محول docx->xhtml مع POI، محول odt->pdf مع ODFDOM+iText، محول odt->xhtml مع ODFDOM...).ويمكنك تنفيذ المحول الخاص بك إذا كنت ترغب في ذلك وتسجيله عبر 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 هو أنه لا يمكنك استخدام عدة إصدارات من قالب XDocReport أو المحول أو المستند في حاوية OSGi الخاصة بك.ولكن هل هي ميزة جيدة لـ XDocReport؟

لا يجب عليك ذلك javax.imageio.spi.ServiceRegistry يعمل مع JDK5 (و JDK6).يوفر JDK6 java.util.ServiceLoader وهي فئة جديدة لخدمات التسجيل مثل javax.imageio.spi.ServiceRegistry.

في 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.ServiceRegistry لJDK5 وJDK6.

تحياتي أنجيلو

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top