Sono un principiante di Java e sto iniziando a capire il concetto di programma di caricamento classi. In questo momento sto riscontrando alcuni problemi con log4j riguardo all'uso del classloader del contesto dei thread.log4j e il contestloader del contesto thread
sto ottenendo i seguenti errori: 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 [[email protected]] whereas object of type "org.apache.log4j.ConsoleAppender" was loaded by [[email protected]]. Could not instantiate appender named "CONSOLE".
La mia applicazione funziona più o meno in questo modo: Su init URLClassLoader # 1 è costruito e carica alcune classi, queste classi utilizzano log4j. Successivamente viene costruito URLClassLoader # 2 (che ha URLClassLoader # 1 come genitore) e carica qualche altra classe, queste classi usano anche log4j. Quando URLClassLoader # 2 viene utilizzato per caricare queste classi, viene visualizzato il messaggio di errore sopra riportato (ce ne sono ancora un paio con lo stesso problema).
La soluzione attuale che ho fatto è stato quello di impostare la corrente di caricamento classe contesto thread per URLClassLoader # 2 prima di caricare le classi problematici, e resettarlo a quello vecchio in seguito:
ClassLoader urlClassLoader; // this is URLClassLoader #2
Thread thread = Thread.currentThread();
ClassLoader loader = thread.getContextClassLoader();
thread.setContextClassLoader(urlClassLoader);
try {
urlClassLoader.loadClass(...)
} finally {
thread.setContextClassLoader(loader);
}
Anche se questo funziona, io non sono certo se è l'approccio giusto
Qualsiasi commento su questo argomento sarà apprezzato. Inoltre, perché log4j mi costringe a fare casino con il classloader del contesto dei thread? Perché non lasciarmi passare in un caricatore di classe (e usarne uno predefinito quando non lo faccio) invece di usare quello del thread?
Mi hai salvato la vita con la tua domanda, sono stato bloccato per 3 giorni con un problema simile! Non ho impostato "thread.setContextClassLoader", e con quello va bene! E 'davvero bello nonostante tu fossi un novizio in java! –