log4j va mavzu konteksti sinf yuklagichi

Men Java-ni yangi boshlovchiman va endigina sinf yuklagichlari tushunchasini tushuna boshladim. Hozirda log4j bilan bog'liq kontekst sinf yuklagichidan foydalanish bilan bog'liq ba'zi muammolarga duch kelmoqdaman.

Men quyidagi xatolarni olaman: A "org.apache.log4j.ConsoleAppender" object is not assignable to a "org.apache.log4j.Appender" variable. The class "org.apache.log4j.Appender" was loaded by [java.net.URLClassLoader@105691e] whereas object of type "org.apache.log4j.ConsoleAppender" was loaded by [sun.misc.Launcher$AppClassLoader@16930e2]. Could not instantiate appender named "CONSOLE".

Mening ilovam taxminan shunday ishlaydi: Init URLClassLoader #1 da tuzilgan va ba'zi sinflarni yuklaydi, bu sinflar log4j dan foydalanadi. Keyinchalik URLClassLoader #2 quriladi (uning ota-onasi sifatida URLClassLoader #1 mavjud) va yana bir nechta sinflarni yuklaydi, bu sinflar log4j dan ham foydalanadi. Ushbu sinflarni yuklash uchun URLClassLoader #2 ishlatilsa, yuqoridagi xato xabari paydo bo'ladi (bir xil muammo bilan yana bir nechtasi bor).

Men qilgan joriy yechim muammoli sinflarni yuklashdan oldin joriy mavzu kontekstli sinf yuklagichini URLClassLoader #2 ga o'rnatish va keyin uni eskisiga qaytarish edi:

ClassLoader urlClassLoader; // this is URLClassLoader #2
Thread thread = Thread.currentThread();
ClassLoader loader = thread.getContextClassLoader();
thread.setContextClassLoader(urlClassLoader);
try {
  urlClassLoader.loadClass(...)
} finally {
  thread.setContextClassLoader(loader);
}

Bu ishlayotgan bo'lsa-da, men bu to'g'ri yondashuv ekanligiga ishonchim komil emas.

Bu masala bo'yicha har qanday tushuncha qadrlanadi. Bundan tashqari, nega log4j meni mavzu konteksti sinf yuklagichi bilan aralashishga majbur qilmoqda? Nima uchun mavzuni ishlatish o'rniga sinf yuklagichiga o'tishimga ruxsat bermaysiz (va agar yo'q bo'lsa, birlamchini ishlataman)?


person Idan K    schedule 29.12.2009    source manba
comment
Siz savolingiz bilan hayotimni saqlab qoldingiz, men 3 kun davomida shunga o'xshash muammoga duch keldim! Men thread.setContextClassLoader ni o'rnatmadim va bu bilan hammasi yaxshi! Java-da yangi boshlovchi bo'lganingizga qaramay, bu juda yoqimli!   -  person Daniel Hári    schedule 05.06.2016


Javoblar (1)


Siz log4j (va Apache Commons Logging kutubxonasi) bilan bog'liq asosiy muammoga qoqilganga o'xshaysiz, ya'ni ular foydalanilayotgan vaqtda to'g'ri sinf yuklovchilarini topish va ular bilan o'zaro aloqada bo'lish kulgili darajada qiyin. Misollar bilan to'ldirilgan juda zich tushuntirish bor, bu yerda; Uyga olib boriladigan xabar shundan iboratki, yangi logging tizimi SLF4J uchun asosiy harakatlantiruvchi kuchlardan biri bu muammolarni bartaraf etish edi. butunlay. Siz uni almashtirib, hayotingiz osonlashayotganini ko'rishingiz mumkin.

person delfuego    schedule 29.12.2009
comment
Hozircha boshqa narsadan foydalanishni boshlashimiz mumkinmi yoki yo'qmi, amin emasman. Ushbu log4j muammosini hal qilishning tavsiya etilgan usuli qanday? - person Idan K; 29.12.2009
comment
Rostini aytsam, men buni ayta olmayman, chunki bu juda yomon muammo bo'lib, men hozir log4j va Apache Commons Logging dan qo'rqaman. Haqiqatan ham, siz SLF4J ga arzimas tarzda o'tishingiz kerak -- qarang slf4j.org/legacy.html SLF4J ko'prik adapterlari bilan qanday ta'minlanganligi haqida ma'lumot olish uchun sizning kodingiz log4j-ga qo'ng'iroq qilishda davom etishi va bu qo'ng'iroqlarni SLF4J tomonidan ushlab turilishi mumkin. Shunday qilib, siz SLF4J-dan har qanday yangi kodda foydalanishingiz mumkin va eski log4j-dan foydalanadigan kodni bo'sh vaqtingizda SLF4J-ga o'tkazishingiz mumkin. - person delfuego; 29.12.2009
comment
Log4j va JCLdan qochish uchun maslahat uchun +1. Ular log4j va jcl uchun moslik qatlamlariga ega SLF4j bilan almashtirildi. Biz buni HAMMA loyihalarimizda aynan shu sabablarga ko'ra qildik. - person mhaller; 29.12.2009
comment
Nima uchun log4j dan qochish kerakligini tushuntiradigan maqolalaringiz bormi? Men, albatta, biron bir ma'lumotsiz bunday taklif bilan chiqolmayman. Shuningdek, SLF4j ning yangi "standart" ekanligi haqidagi ba'zi ma'lumotlar yordam berishi mumkin. - person Idan K; 29.12.2009
comment
Daniel, bog'langan maqola (zich tushuntirish havolasi) muammoni tushuntiradi va siz duch kelayotgan muammo barchaga eng yaxshi misol bo'lishi kerak. - person delfuego; 29.12.2009
comment
rahmat, men uni va SO da SLF4j bilan bog'liq boshqa savollarni ko'rib chiqaman - person Idan K; 30.12.2009