Why do I get a java.lang.NoSuchFieldError: on an Enum value?
Why do I get a java.lang.NoSuchFieldError: on an Enum value?
我在自己制作的罐子里有一个枚举。这个 jar 是第二个 jar 的依赖项,它使用枚举值。
现在,第二个 jar 是一个日志框架,而本例中的第一个 jar 是日志框架的模型 类。
我正在尝试将此日志记录框架实现到我制作的 Web 应用程序中。长话短说,它仍然需要一些工作,但我被困在一个问题上。框架配置初始化中的错误被捕获为异常,并调用一个方法。这个方法有一个枚举值作为它的参数之一。但是,我在这个枚举上得到了 java.lang.NoSuchFieldError。
枚举值是错误的,所以我认为这可能是巧合。但是当我将其更改为 BABYLOVE 时,错误消息也发生了变化。
我检查了 and/or 名称中可能存在的重叠,但我可以找到 none。
顺序:
- Web App 调用初始化日志框架(直接依赖)
- logging-framework 在加载自己的配置时出现问题,并抛出异常
- 处理异常,调用方法注册错误
- 该方法使用多个参数调用,其中一个是来自 logging-framework-model.jar 的枚举值,它是 Web 应用程序的传递依赖项
网络应用抛出异常
java.lang.NoSuchFieldError: BABYLOVE
at logging.framework.Constants.<clinit>(Constants.java:52)
at logging.framework.Logger.<init>(Logger.java:60)
at logging.framework.LogContext.getLoggerFromContext(LogContext.java:95)
at logging.framework.LogContext.getCurrent(LogContext.java:48)
at action.navigation.CalendarElementEditorAction.execute(CalendarElementEditorAction.java:39)
Truncated. see log file for complete stacktrace
常量,第 51-52 行:
public static final Event ConfigValidationFailed =
EventLogHelper.getEvent(EventLogSource.LoggingFramework, EventLogEntryType.BABYLOVE");
事件日志条目类型:
@XmlType(name = "EventLogEntryType")
@XmlEnum
public enum EventLogEntryType {
//for test purposes, should be removed. This variable is given a name that can not be confused with standard names in error messages, like Error and Warning can.
@XmlEnumValue("BabyLove")
BABYLOVE("BabyLove"),
@XmlEnumValue("Error")
ERROR("Error"),
@XmlEnumValue("Warning")
WARNING("Warning"),
@XmlEnumValue("Information")
INFORMATION("Information"),
@XmlEnumValue("SuccessAudit")
SUCCESSAUDIT("SuccessAudit"),
@XmlEnumValue("FailureAudit")
FAILUREAUDIT("FailureAudit");
private final String value;
EventLogEntryType(String v) {
value = v;
}
public String value() {
return value;
}
public static EventLogEntryType fromValue(String v) {
for (EventLogEntryType c: EventLogEntryType .values()) {
if (c.value.equals(v)) {
return c;
}
}
throw new IllegalArgumentException(v);
}
我不知道这是否重要,但我正在使用 maven2 来处理我的依赖项。
我被告知要检查我的依赖项的版本是否不匹配,在检查 war 的内容后,我发现这是问题所在。
我的 webapp 是两个非常相似的 webapp 之一,它们都依赖于包含一些基本模型和业务逻辑的 jar 类。我之前已将日志记录框架(版本 1)添加到该项目的 pom.xml。因此,日志框架 1.0 是 Web 应用的传递依赖,而日志框架 2.0 是 Web 应用的直接依赖。我猜直接依赖优先于传递依赖,所以 2.0 被打包到我的 war 中。但是,由于日志框架是由一个框架(直接依赖)和一组模型类(传递依赖)组成的,所以war是用日志框架模型版本1.0打包的。
在我解压 war 并找到它之后,找出它被错误导入的位置是一个非常简单的过程,最后我只得到了完整的日志框架 2.0 版。
我在自己制作的罐子里有一个枚举。这个 jar 是第二个 jar 的依赖项,它使用枚举值。
现在,第二个 jar 是一个日志框架,而本例中的第一个 jar 是日志框架的模型 类。
我正在尝试将此日志记录框架实现到我制作的 Web 应用程序中。长话短说,它仍然需要一些工作,但我被困在一个问题上。框架配置初始化中的错误被捕获为异常,并调用一个方法。这个方法有一个枚举值作为它的参数之一。但是,我在这个枚举上得到了 java.lang.NoSuchFieldError。
枚举值是错误的,所以我认为这可能是巧合。但是当我将其更改为 BABYLOVE 时,错误消息也发生了变化。
我检查了 and/or 名称中可能存在的重叠,但我可以找到 none。
顺序:
- Web App 调用初始化日志框架(直接依赖)
- logging-framework 在加载自己的配置时出现问题,并抛出异常
- 处理异常,调用方法注册错误
- 该方法使用多个参数调用,其中一个是来自 logging-framework-model.jar 的枚举值,它是 Web 应用程序的传递依赖项
网络应用抛出异常
java.lang.NoSuchFieldError: BABYLOVE at logging.framework.Constants.<clinit>(Constants.java:52) at logging.framework.Logger.<init>(Logger.java:60) at logging.framework.LogContext.getLoggerFromContext(LogContext.java:95) at logging.framework.LogContext.getCurrent(LogContext.java:48) at action.navigation.CalendarElementEditorAction.execute(CalendarElementEditorAction.java:39) Truncated. see log file for complete stacktrace
常量,第 51-52 行:
public static final Event ConfigValidationFailed =
EventLogHelper.getEvent(EventLogSource.LoggingFramework, EventLogEntryType.BABYLOVE");
事件日志条目类型:
@XmlType(name = "EventLogEntryType")
@XmlEnum
public enum EventLogEntryType {
//for test purposes, should be removed. This variable is given a name that can not be confused with standard names in error messages, like Error and Warning can.
@XmlEnumValue("BabyLove")
BABYLOVE("BabyLove"),
@XmlEnumValue("Error")
ERROR("Error"),
@XmlEnumValue("Warning")
WARNING("Warning"),
@XmlEnumValue("Information")
INFORMATION("Information"),
@XmlEnumValue("SuccessAudit")
SUCCESSAUDIT("SuccessAudit"),
@XmlEnumValue("FailureAudit")
FAILUREAUDIT("FailureAudit");
private final String value;
EventLogEntryType(String v) {
value = v;
}
public String value() {
return value;
}
public static EventLogEntryType fromValue(String v) {
for (EventLogEntryType c: EventLogEntryType .values()) {
if (c.value.equals(v)) {
return c;
}
}
throw new IllegalArgumentException(v);
}
我不知道这是否重要,但我正在使用 maven2 来处理我的依赖项。
我被告知要检查我的依赖项的版本是否不匹配,在检查 war 的内容后,我发现这是问题所在。
我的 webapp 是两个非常相似的 webapp 之一,它们都依赖于包含一些基本模型和业务逻辑的 jar 类。我之前已将日志记录框架(版本 1)添加到该项目的 pom.xml。因此,日志框架 1.0 是 Web 应用的传递依赖,而日志框架 2.0 是 Web 应用的直接依赖。我猜直接依赖优先于传递依赖,所以 2.0 被打包到我的 war 中。但是,由于日志框架是由一个框架(直接依赖)和一组模型类(传递依赖)组成的,所以war是用日志框架模型版本1.0打包的。
在我解压 war 并找到它之后,找出它被错误导入的位置是一个非常简单的过程,最后我只得到了完整的日志框架 2.0 版。