【问题标题】:Why are log4j classes loaded by two class loaders?为什么 log4j 类由两个类加载器加载?
【发布时间】:2022-02-02 13:36:34
【问题描述】:

我有一个应用程序的 maven 项目,我在 WildFly 服务器中运行。该项目具有 log4j 依赖项:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.17.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.1</version>
</dependency>

我想像这样获得 LoggerContext:

LoggerContext ctx = (LoggerContext) LogManager.getContext(false);

但是,这会导致 ClassCastException:

class org.apache.logging.log4j.core.LoggerContext cannot be cast to class org.apache.logging.log4j.core.LoggerContext (org.apache.logging.log4j.core.LoggerContext is in unnamed module of loader 'deployment.WEB.war' @6e285ef6; org.apache.logging.log4j.core.LoggerContext is in unnamed module of loader 'deployment.WEB.war' @239cb91f)

经过一番调试,我发现问题在于 LoggerContext 类是通过两个不同的类加载器加载的。这怎么可能?起初,我认为这些依赖项会有两种不同的声明,但这可能不是那个问题。 (我已将版本更改为 2.17.0 并在两个 LoggerContext 类上调用了 class.getPackage().getSpecificationVersion()。对于这两个类,版本都已更改)。

类被加载两次的原因是什么?

【问题讨论】:

  • 只是为了确定:您的类路径/模块路径中没有多次使用 log4j,例如在一些更中心的位置,比如应用服务器?
  • @Thomas 我认为不是。我只在 wildfly/modules 的某个地方找到了 log-api-2.15.0.jar。
  • 你的war文件不包含它?
  • @Thomas 战争文件只包含一次 log4j-api.2.17.1.jar 和 log4j-core.2.17.1.jar(在 WEB-INF\lib 中)

标签: java maven classloader log4j2


【解决方案1】:

嗯,由于 Wildfly 中存在 log4j 库,类似乎被加载了两次。

如何避免这种情况: 向 WEB-INF 添加配置以从 wildfly 中排除日志库:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
    <exclude-subsystems>
        <subsystem name="logging"/>
    </exclude-subsystems>
    <exclusions>
        <module name="org.apache.commons.logging"/>
        <module name="org.apache.log4j"/>
        <module name="org.jboss.logging"/>
        <module name="org.jboss.logging.jul-to-slf4j-stub"/>
        <module name="org.jboss.logmanager"/>
        <module name="org.jboss.logmanager.log4j"/>
        <module name="org.slf4j"/>
        <module name="org.slf4j.impl"/>
    </exclusions>
</deployment>
</jboss-deployment-structure>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多