Logger 在处理自定义日志消息时在运行时抛出 IncompatibleClassChangeError class

Logger throws IncompatibleClassChangeError at runtime when processing a custom log message class

我在库 A 中有如下实现

public class CustomLogMessage implements Message { //some implementation }

然后,库 A 被引入 B(通过 maven 依赖)并在 B 中有以下实现:

public class JohnDoe {
    
    private static final Logger LOGGER = LogManager.getLogger(JohnDoe .class);
    
   
    public static void message(some args) {
        LOGGER.info(new CustomLogMessage(args));
    }
    
}

通过单元测试,这个工作非常好,但是当我在本地部署这个应用程序时,记录器抛出 IncompatibleClassChangeError 异常,最里面的堆栈跟踪是 AbstractAppender class 来自 log4j.

org.apache.logging.log4j.spi.AbstractLogger.info(AbstractLogger.java:1290)

在此实现之前,B 用于使用 log4j (1.2.17) 并返回 CustomLogMessage class 只需实现 Serializable 接口,然后它已经可以传递到记录器的参数中。

但是B升级到log4j2(2.17.1)后,CustomLogMessageclass现在需要实现Message接口。 (参见 https://logging.apache.org/log4j/2.x/manual/messages.html

我不知道为什么会这样,也不知道异常的实际含义。 有人能指出我为什么会遇到这个问题吗?

事实证明,有一个库 C 引用了 CustomLogMessage class 的旧实现,并且这个库 C 首先由 JVM 加载并且因此,当它在 run-time 期间到达此行 LOGGER.info(new CustomLogMessage(args)); 时,它抛出了异常(二进制不兼容)。