سؤال

لدي تطبيق تطبيق يحتاج إلى الاتصال بـ JAXP ، على وجه التحديد Saxparserfactory. الآن ، كما ترون من Javadoc ، يستخدم هذا داخليًا آلية مزود الخدمة كما هو موثق هنا:

على وجه التحديد ، إذا لم يجد ملفًا في أي من الجرار META-INF/services/javax.xml.parsers.SAXParserFactory سيحاول جلبه من قاعدة كود التطبيق الخاصة بي. إذا كان لدي تطبيق التطبيق الخاص بي على النحو التالي:

<applet code="com.example.applets.MyApplet" 
 codebase="http://www.example.com/myapp/" archive="myapp.jar, dom4j.jar">

ثم سيحاول تقديم طلب HTTP إلى http://www.example.com/myapp/meta-inf/services/javax.xml.parsers.saxparserfactory

أفضل عدم القيام بذلك ، على وجه التحديد لأن تطبيق التطبيق الخاص بي موقّع وأن مكالمة HTTP الإضافية هذه تؤدي إلى تحذير حول رمز غير موقّع.

الآن ، يتمثل الحل الواضح في وضع ملف التعريف/الخدمات في جرة التطبيق كما يقول ، لكن كيف أفعل ذلك ، ما زلت أحصل عليه لاستخدام تطبيق JRE الافتراضي للمستخدم لـ JAXP؟ بالتناوب ، هل هناك طريقة لإقناع وقت تشغيل التطبيقات بالبحث فقط في ملفات الجرة الخاصة بي وليس في codebase لهذا الملف؟

ملاحظة: أعلم أنه يمكنني أيضًا نشر نسختي الخاصة من Jaxp-Ri ، لكن هذا الوزن الثقيل جدًا للتطبيق.

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

المحلول

قم بتعطيل البحث عن قاعدة كود:

<applet ...>
 <param name="codebase_lookup" value="false">
</applet>

ال AppletClassLoader يتحقق من عقار منطقي sun.applet.AppletClassLoader.codebaseLookup, والتي يمكن أن تتأثر بتعيين المعلمة أعلاه. طريقة sun.applet.AppletPanel.init() سوف تقرأ المعلمة وتعيينها في AppletClassLoader. بمجرد تعطيله ، سيتوقف AppleTclassloader عن إجراء عمليات بحث عن بُعد للفئات والموارد في قاعدة الشفرة ، وهذا هو عنوان URL المقدم بواسطة codebase="http://www.example.com/myapp/" وابحث فقط في المحفوظات ومسارات فئة النظام.

ملاحظة: لم أختبر هذا بنفسي ، لكن وفقًا لمراجعة التعليمات البرمجية في الكود المفوض ، أعتقد بصراحة أنه يمكن أن ينجح.

تم توثيقه أيضًا في Javase - ملاحظات تقنية - دليل مطور البرنامج المساعد - سمات خاصة:

codebase_lookup

عندما يحتاج Applet ClassLoader إلى تحميل فئة أو مورد (على سبيل المثال ، ملفات التكوين لمقدمي الخدمات القابلة للتوصيل ضمن دليل META-INF/Services) ، فإنه يبحث أولاً عن الملفات المطلوبة في ملفات Applet Jar ثم من قاعدة كود Applet. عادةً ما يتم نشر التطبيقات مع جميع الفئات والموارد المطلوبة المخزنة في ملفات applet JAR. في هذه الحالة ، يكون البحث عن قاعدة كود لا لزوم له.

إذا لم يكن الفصل أو المورد متاحًا من ملفات Applet Jar ، فقد يكون من الأفضل أن يفشل جهاز تحميل الفئة بدلاً من محاولة البحث عن قاعدة كود. خلاف ذلك ، يجب إجراء اتصال إلى قاعدة كود Applet للبحث عن الفصل أو المورد ، وقد يكون له تأثير في الأداء على وقت تشغيل التطبيق.

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