سؤال

يشتمل تطبيق servlet الخاص بي على عدد من مكتبة .jars، بعضها يحتوي على ملفات log4j.xml أو log4j.properties.أود التأكد من أن log4j يعثر على log4j.xml الخاص بي أولاً!لقد حاولت البحث عن بعض المواصفات لأولويات عناصر مسار الفصل المختلفة في servlet (على سبيل المثال.هل يسبق WEB-INF/classes دائمًا WEB-INF/lib؟) أو طريقة ما لتكوين أو تعديل أداة تحميل فئة servlet بحيث يظهر دليل مورد معين مبكرًا في مسار الفئة.حتى الآن، لقد رسمت فارغة.هل هناك أي اقتراحات بشأن التأكد من أن ملف servlet .war يقوم بتحميل السجل الصحيح log4j.xml عبر أداة تحميل الفصل؟

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

المحلول

وبقدر ما أفهم اختيار المورد من CLASSPATH هو غير القطعية (من وجهة نظر المطور التطبيق). حتى إذا تم تحميل الملف نفسه باستمرار يمكن تغيير السلوك:  1. عند ترقية إصدار الحاويات الحالية.  2. إذا قمت بالتبديل الحاويات.

وأبسط حل سيكون ل<م> إزالة جزءا لا يتجزأ من ملفات التكوين log4j من الجرار مكتبة . يكاد يكون أبدا فكرة جيدة لتضمين log4j في التكوين لأنه يؤدي إلى المشكلة التي نشهد هنا ...

هل هم الجرار طرف ثالث أو الجرار التي وضعت؟

نصائح أخرى

القط 8.5

كما سبق تومكات 8.0.

انظر الوثائق: كيفية تحميل الفئة.

تومكات 8.0

الجواب بسيط، مأخوذ من صفحة وثائق Tomcat، كيفية تحميل الفئة.على وجه الخصوص، لاحظ استخدام /WEB-INF/ الدليل/المجلد.

ولذلك، من منظور تطبيق الويب، فإن تحميل الفئة أو الموارد يظهر في المستودعات التالية، بهذا الترتيب:

  • فئات Bootstrap لـ JVM الخاص بك
  • /WEB-INF/classes من تطبيق الويب الخاص بك
  • /WEB-INF/lib/*.jar من تطبيق الويب الخاص بك
  • فئات محمل فئة النظام (الموصوفة أعلاه)
  • فئات محمل الفئة الشائعة (الموصوفة أعلاه)

إذا كان محمل فئة تطبيق الويب هو تم تكوينه مع <Loader delegate="true"/> فيصبح الترتيب :

  • فئات Bootstrap لـ JVM الخاص بك
  • فئات محمل فئة النظام (الموصوفة أعلاه)
  • فئات محمل الفئة الشائعة (الموصوفة أعلاه)
  • /WEB-INF/classes من تطبيق الويب الخاص بك
  • /WEB-INF/lib/*.jar من تطبيق الويب الخاص بك

القط 6

مقتبس من صفحة Tomcat 6، كيفية تحميل الفئة.

ولذلك، من منظور تطبيق الويب، فإن تحميل الفئة أو الموارد يظهر في المستودعات التالية، بهذا الترتيب:

  • فئات Bootstrap لـ JVM الخاص بك
  • فئات محمل فئة النظام (الموصوفة أعلاه)
  • /WEB-INF/classes من تطبيق الويب الخاص بك
  • /WEB-INF/lib/*.jar من تطبيق الويب الخاص بك
  • $CATALINA_HOME/lib
  • $CATALINA_HOME/lib/*.jar

ونحن Log4jConfigListener الربيع في ملف web.xml لدينا.

ويمكنك تحديد كمعلمة السياق موقع ملف التكوين log4j، أي هل يمكن تعيينه /WEB-INF/log4j.xml

وهذا من شأنه أن يكون خيارا بالنسبة لك؟ إذا كنت لا تستخدم الربيع وأنا أعلم أنه يمكنك تعيين موقع Log4j برمجيا التي قد تعمل أيضا.

في تجربتي، WEB-INF/classes عادةً ما تكون لها الأسبقية على الجرار في WEB-INF/lib، ومع ذلك، يعتمد ذلك أيضًا على حاوية servlet التي تستخدمها (لم أتمكن أبدًا من معرفة سلوك JRun، على سبيل المثال).سيكون من المفيد جدًا أن تخبرني عن الحاوية التي تستخدمها.

أيضًا، هل أنت متأكد من أن تكوين log4j المخالف موجود في جرة في WEB-INF/lib؟عادةً، عندما أواجه مشكلات classpath في حالة حاوية servlet، يكون ذلك بسبب المكتبات الموجودة الخارج من تطبيق الويب.

مواصفات السيرفلت يوصي تقوم أدوات تحميل فئات تطبيقات الويب بتحميل فئاتها الخاصة قبل التفويض إلى أداة تحميل فئات الحاوية (SRV.9.7.2)، ولكن نظرًا لأن هذا يتعارض مع مواصفات Java، لا يقوم جميع البائعين بذلك بشكل افتراضي (في الواقع Tomcat هي الحاوية الوحيدة التي قمت بها المستخدمة التي تفعل ذلك بشكل افتراضي).مع ذلك، من الممكن دائمًا تكوين سلوك تحميل فئة تطبيق الويب الخاص بحاويتك.إذا أخبرتني عن الحاوية التي تستخدمها، فقد أتمكن من مساعدتك (على وجه التحديد، لقد قمت بذلك بنجاح من قبل على WebLogic وWebSphere وGlassfish وJRun)).

إذا كنت غير قادر على السيطرة على CLASSPATH، منذ القط هو وضع ذلك بالنسبة لك، هل أنت على الأقل قادرا على تعيين خاصية نظام log4j.configuration؟ وأعتقد أن الموقع أشار إليها يمكن تعيين تلك الممتلكات خارج CLASSPATH.

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

وتحتاج إلى أن يكون log4j.properties في CLASSPATH الخاص بك. أفضل مكان هو تحت WEB-INF / فصول.

لديك أيضا للتأكد من أن كنت تستخدم إصدار log4j.jar. لذلك، ووضعها في WEB-INF / ليب، فقط للتأكد من أنك لا تستخدم واحدة من المجلدات قط، لأنه قد يسبب مشاكل classloading غريب.

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