当前位置: 首页 > 面试题库 >

log4j和线程上下文类加载器

令狐建修
2023-03-14
问题内容

我是Java的新手,刚开始弄清类加载器的概念。现在,关于线程上下文类加载器的使用,log4j出现了一些问题。

我收到以下错误: 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".

我的应用程序大致以这种方式工作:在初始化URLClassLoader#1时,它会构建并加载一些类,这些类使用log4j。稍后在URLClassLoader#2上进行构造(其父类为URLClassLoader#1)并加载更多类,这些类也使用log4j。当使用URLClassLoader#2加载这些类时,会出现上述错误消息(有多个问题相同)。

我目前的解决方法是在加载有问题的类之前将当前线程上下文类加载器设置为URLClassLoader#2,然后将其重置为旧的类:

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

尽管此方法有效,但我不确定这是否正确。

任何对此事的见解将不胜感激。另外,为什么log4j强迫我弄乱线程上下文类加载器?为什么不让我传递类加载器(如果不使用,则使用默认的加载器)而不是使用线程的加载器?


问题答案:

您似乎偶然发现了log4j(和Apache Commons
Logging库)的主要问题,即当它们被使用时,它们很难找到正确的类加载器并与之交互。有一个非常密集的解释,完整的例子,在这里
;
传达的信息是,新日志记录框架SLF4J的主要推动力之一是完全消除这些问题。您可能想要交换它,看看您的生活是否变得更轻松。




 类似资料:
  • 问题内容: 线程的上下文类加载器和普通类加载器有什么区别? 也就是说,如果和返回不同的类加载器对象,将使用哪一个? 问题答案: 每个类将使用其自己的类加载器来加载其他类。所以,如果引用则需要上的类加载器的类路径,或者它的父母。 线程上下文类加载器是当前线程的当前类加载器。可以从中的类创建对象,然后将其传递给拥有的线程。在这种情况下,如果对象要加载其自己的类加载器上不可用的资源,则需要直接使用。

  • 我正在开发一个独立的Java应用程序,在启动我的应用程序时,我会面临以下log4j警告: log4j:WARN找不到记录器(org.springframework.core.env.StandardEnvironment)的appender。log4j:警告请正确初始化log4j系统。 然而,在加载spring上下文(下面的main method中的第3行)之后,我能够看到所有“与spring相关

  • 我是spring的新手,我想知道是否可以只通过注释必须注入变量的类来加载应用程序(而不是使用ApplicationContext ctx=new ApplicationContext(“MyAppContext”))。 我举以下例子: 我有一个类,其中一个字符串应该是自动连线的 spring bean配置文件(testSpringContext.xml)如下所示 现在,我想使用中的以下代码显示自动

  • 本章需要2个jar包, log4j的jar及nutz的源码jar Nutz源码 有些人喜欢关联javadoc,但本书还是建议关联源码 下载地址 Log4j Java日志系统的事实标准 官网: http://logging.apache.org/log4j/1.2/ 最新版是2.x系列,但咱们不用,用经典的1.2.x系列 下载地址 在nutzbook项目中建个文件夹叫sources,把nutz的源码

  • 我正在尝试将作为web应用程序加载,并随独立的一起提供。当我的正在启动时,我提取文件并将其复制到文件系统。之后,我做了一个简单的调用,我希望它能起作用。但看看: 问题是,在返回之后,我得到了大量的。您可以在这里看到完整的输出,但它可以归结为: 最后一个例外是,它肯定与上面的错误有关: 似乎所有的依赖项都缺失了。问题是我必须做些什么来解决这个问题。正如建议的那样,我还将依赖项放到Spring应用程序