将 LogManager (l4j2) 与 Java 8 一起使用时出错(java.lang.reflect.AnnotatedElement 无法解析)

2022-09-03 10:13:24

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

无法解析 java.lang.reflect.AnnotatedElement 类型。它从所需的.class文件中间接引用

这是代码:

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

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

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


答案 1

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

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

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

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

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


答案 2

如果在从Eclipse中运行的Tomcat中发生这种情况(问题被关闭为重复并在此处重定向),请转到首选项→服务器→运行时环境→Tomcat版本→编辑...并确保所选的 JRE 与 Tomcat 版本匹配。(也许你需要安装一个。


推荐