مشكلات أداة تحميل الفئة - كيفية تحديد إصدارات المكتبة (ملفات الجرة) التي سيتم تحميلها

StackOverflow https://stackoverflow.com/questions/139534

  •  02-07-2019
  •  | 
  •  

سؤال

لقد قمت للتو بحل مشكلة أخرى *على الرغم من أنني كنت أستخدم هذا الإصدار من المكتبة ولكن يبدو أن خادم التطبيق الخاص بي قد تم تحميله بالفعل بإصدار أقدم من -هذه-المكتبة-*المسألة (تنهد).

هل يعرف أي شخص طريقة جيدة للتحقق (أو المراقبة) مما إذا كان التطبيق الخاص بك لديه حق الوصول إلى جميع ملفات jar المناسبة، أو إصدارات الفئة المحملة؟

شكرا لك مقدما!

[ملاحظة.سبب وجيه للغاية لبدء استخدام بنية وحدة OSGi في تصوري!]

تحديث: هذا ساعدت المادة كذلك!لقد أعطاني فكرة عن الفئات التي تم تحميلها بواسطة أداة تحميل فئة JBoss عن طريق كتابتها في ملف سجل.

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

المحلول

إذا كنت تستخدم JBoss، فهناك MBean (مستودع مُحمل الفئة iirc) حيث يمكنك طلب جميع أدوات تحميل الفئة التي قامت بتحميل فئة معينة.

إذا فشل كل شيء آخر، فهناك دائمًا "java -verbose:class" الذي سيطبع موقع الجرة لكل ملف فئة يتم تحميله.

نصائح أخرى

إذا كانت لديك معلومات الإصدارات المناسبة في بيان الجرة، فهناك طرق لاسترداد الإصدار واختباره.لا حاجة لقراءة البيان يدويا.

java.lang.Packageيبدو أن .getImplementationVersion() و getSpecificationVersion() و isCompatibleWith() سيفعلون ما تبحث عنه.

يمكنك الحصول على الحزمة باستخدام this.getClass().getPackage() من بين طرق أخرى.

لا يوفر javadoc لـ java.lang.Package أسماء سمات البيان المحددة لهذه السمات.أدى البحث السريع على Google إلى ظهوره في http://java.sun.com/docs/books/tutorial/deployment/jar/packageman.html

في الإصدار الحالي من Java، يعد إصدار المكتبة مصطلحًا غامضًا إلى حد ما يعتمد على تعبئة JAR بشكل صحيح مع بيان مفيد.وحتى في هذه الحالة، يتطلب التطبيق قيد التشغيل الكثير من العمل لجمع هذه المعلومات معًا بطريقة مفيدة.لا يمنحك وقت تشغيل JVm أي مساعدة على الإطلاق.

أعتقد أن أفضل رهان لك هو تنفيذ ذلك في وقت الإنشاء، باستخدام أدوات إدارة التبعية مثل Ivy أو Maven لجلب الإصدارات الصحيحة من كل شيء.

ومن المثير للاهتمام أن Java 7 من المحتمل أن تتضمن إطارًا مناسبًا لإصدار الوحدة النمطية لهذا النوع من الأشياء على وجه التحديد.ليس أن هذا يساعدك في هذه اللحظة،

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

شرح مبسط لكيفية العمل هو:سيبحث EJB أو تطبيق الويب أولاً عن فئة أو مورد في المكتبات المعلنة في الوحدة النمطية الخاصة به (ejb-jar أو war).إذا لم يتم العثور على الفئة هناك، يقوم مُحمل الفئة بإعادة توجيه الطلب إلى مُحمل الفئة الأصلي الخاص به والذي يكون إما تبعية معلنة (عادةً ejb) أو مُحمل فئة التطبيق المسؤول عن تحميل المكتبات والموارد المعلنة في حزمة الأذن .إذا لم يتم العثور على الفصل أو المورد، فسيتم إعادة توجيه الطلب إلى خادم التطبيق الذي سيبحث في مسار الفصل الخاص به.

ومع ذلك، يجب أن تتذكر أن وحدة Java EE (تطبيق الويب، ejb) ستقوم دائمًا بتحميل الفئات من الجرة الموجودة في النطاق الأقرب.على سبيل المثال، إذا قمت بحزم log4j v1 في ملف الحرب، وlog4j v2 على مستوى الأذن ووضعت log4j v3 في مسار فئة خادم التطبيق الخاص بك، فستستخدم الوحدة jar في الوحدة النمطية الخاصة بها.خذ هذا بعيدًا وسيستخدم واحدًا على مستوى الأذن.أخرج ذلك وسوف يستخدم المسار الموجود في مسار خادم التطبيق.تصبح الأمور أكثر صعوبة عندما يكون لديك تبعيات معقدة بين الوحدات.

الأفضل هو وضع مكتبات التطبيقات العالمية على مستوى الأذن.

يجب أن تكون هناك طريقة أفضل من الطريقة التي أفعل بها ذلك، لكنني أميل إلى القيام بذلك بطريقة يدوية للغاية.

  1. يجب أن يكون لكل Jar رقم إصداره في اسم الملف (إذا لم يغير اسمه).
  2. كل تطبيق له مسار دراسي خاص به.
  3. يجب أن يكون هناك سبب لبدء استخدام Jar المحدث (الإصدار الجديد).لا تتغير فقط لأنه متاح، بل قم بالتغيير لأنه يمنحك الوظائف التي تحتاجها.
  4. يجب أن يتضمن كل إصدار جميع الجرار المطلوبة.
  5. أحتفظ بفئة الإصدار التي تعرف قائمة الجرار التي تحتاجها (يتم ترميزها في الملف المصدر) ويمكن التحقق منها في وقت التشغيل مقابل قائمة الجرار في مسار الفصل.

كما قلت، إنه يدوي، لكنه يعمل.

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