java - 在 Java 8 中使用 LogManager (l4j2) 时出错(无法解析 java.lang.reflect.AnnotatedElement)

标签 java java-7 java-8 log4j2

我刚刚在将我的一个新项目的JDK版本从7u45切换到8u20时遇到了一个奇怪的错误。我的类(class)开始时无害的 LogManager 声明被拒绝并出现以下错误:

The type java.lang.reflect.AnnotatedElement cannot be resolved. It is indirectly referenced from required .class files

这是代码:

public class Class1 {   
    private static Logger log = LogManager.getLogger(Class1.class); 
    ...

Eclipse 建议我配置构建路径,但我不知道配置什么,因为我不知道该错误的根本问题。

使用版本 7 的 JDK,一切正常。

最佳答案

当使用 JDK 8 和带有自己的编译器的 IDE(或任何其他代码处理工具/框架)时,例如 Eclipse,您必须将工具更新到支持 Java 8 的版本,即使您没有使用更新的版本Java 8 功能。

原因是编译器必须能够加载 JRE 的较新类文件,以便编译引用这些类的软件。

有时您可以在忽略类文件的较新版本号时使用较旧的编译器。但是有些类型会混淆旧的类文件解析器,因为它们使用新功能,特别是 AnnotatedElement ,现在有 default 方法,和 Map.Entry ,一个 interface 现在有 static 方法。

Eclipse 似乎在说“«classname» 无法解析”时,在找不到类文件的引用和它读取失败的类文件之间没有区别。

这同样适用于使用 ECJ 作为嵌入式编译器的所有工具和框架。

关于java - 在 Java 8 中使用 LogManager (l4j2) 时出错(无法解析 java.lang.reflect.AnnotatedElement),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26102115/

相关文章:

java - 序列化框架(无无参数构造函数)

Java - 基本多线程

java nio - Paths.get() 如何查找项目根目录中的文件夹?

java - java 1.7 中的无效标志参数

java - Java 7 try-with-resources 的 Clover 检测后编译失败

java - 为什么 Java 不允许多重继承,但允许遵循具有默认实现的多个接口(interface)

java - 当数组大小 > 索引时为 "java.lang.ArrayIndexOutOfBoundsException: 1"

java - 排序 BigDecimal

java - 填写 list <?扩展 Foo>

java - 使用 Map 值在 Java 8 中使用流进行分组