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));
时,它抛出了异常(二进制不兼容)。
我在库 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));
时,它抛出了异常(二进制不兼容)。