سؤال

أقوم بتطوير حزم OSGI باستخدام Eclipse. أختبر الرمز ، باستخدام تكوين وقت تشغيل Eclipse OSGI.

يعمل الرمز بشكل جيد هناك ، لكن عندما أقوم بتصدير الحزم كجرار وأحاول استخدامها في بيئة أخرى (Pax-Runner ، على سبيل المثال) ، أحصل على استثناءات ClassNotFound في وقت التشغيل. يتم تثبيت الحزم بشكل جيد ، مع عدم وجود أخطاء. أقوم بتنفيذ الأمر على الاعتدال: "رقم حزمة الدياج" ويقول: "لا توجد قيود لم يتم حلها" لكل حزمة.

أود أن أعرف ما إذا كانت هناك أداة/طريقة يجب معرفتها ، للحصول على حزمة .jar معينة إذا كانت بحاجة إلى أي مكتبة خارجية ، والتي لم يتم وصفها في manifest.mf.

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

المحلول

سيتم حل حزمةك إذا كانت جميع الحزم المدرجة في Import-Package (والحزم المدرجة في Require-Bundle) تم العثور عليها في وقت التشغيل. إذا حصلت ClassNotFoundException أو NoClassDefFoundError بعد الحل ، فهذا يعني أن محتوى Import-Package كان خطأ.

ألق نظرة على أداة BND بواسطة Peter Kriens. هذا يؤدي فحصًا ثابتًا لرمز BYTECODE الذي تم تجميعه من فصولك لاكتشاف التبعيات الدقيقة ، ويولد Import-Package بيان لك. بشكل عام إذا كنت تستخدم BND ، يجب ألا ترى أبدًا ClassNotFound/noclassDeffound ما لم يتم تحميل فئات ديناميكيًا بالاسم ، على سبيل المثال Class.forName().

نصائح أخرى

قام JBoss فقط بإصدار أداة تشخيصية رائعة مفتوحة المصدر حول التبعيات: http://jboss.org/tattletale

تتمثل إحدى الميزات في تحليل ملفات JAR عن طريق التأمل ، للعثور على جميع التبعيات التي تفتقر إليها.

لقد فعلت شيئًا كهذا لفترة من الوقت (كنت أقوم بتجميع Java إلى .NET عبر IKVM ، لكنني كنت بحاجة إلى التبعيات بين الجرار) استخدمت jaranalyzer لإنشاء رسم بياني للتبعيات.

لقد نجحت مع أداة Springsource's Bundlor-Shell. هناك تعليمات لاستخدامه هنا. أنت تعطيها جرة ، جنبا إلى جنب مع اسم وإصدار للحزمة الجديدة التي تريد إنشاؤها من تلك الجرة. ثم يقوم بتحليل ملفات الفصل داخل الجرة وتنتج قالبًا يوضح يستورد أي حزم تجدها.

يتمثل الجزء الصعب بعد ذلك في العمل على التبعيات اختيارية ، وما هو إصدار كل حزمة يعتمد عليها. يجب عليك قراءة موقع الويب ، وملاحظات الإصدار ، إلخ. للمكتبة لمعرفة ذلك.

ستحصل على "أي قيود لم يتم حلها" إذا لم تستورد الحزمة فعليًا أي حزم أو تتطلب حزمًا أخرى ؛ فيما يتعلق بوقت تشغيل OSGI ، ستكون الحزمة قابلة للاستخدام. ولكن بمجرد وصوله إلى فئة خارجية ، كما في حالتك ، ستحصل على المخيف ClassNotFoundException.

ستمنحك بيئة تطوير المكونات الإضافية Eclipse (PDE) أخطاء ترجمة إذا كان الرمز الخاص بك يستخدم فئات غير مدرجة في ManySt.MF. غالبًا ما تكون الاستثناءات ClassNotFound في وقت التشغيل بسبب استيرادات الحزمة غير الصحيحة على أنها اختيارية - تحل الحزم ، لكنها لن تعمل. قد يؤدي التجميع مقابل إصدار مختلف من الحزمة أو الحزمة مما تديره أيضًا إلى هذا النوع من الخطأ.

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