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/27201858/

相关文章:

Java 8 Streams - 为什么我不能对整数流求和?

java - 如何从 Spring Security 中删除过滤器?

java - 单元测试与行为相关的私有(private)字段

java - 如何在java中生成满足泊松分布的随机时间戳

java - 字符串数组到二维字符串数组

java - 这个棋盘小程序有什么问题?

java - 如何在java中创建反向 map ?

java - 使用 ConcurrentHashSet 时的线程安全引用分配

java - 用于 Mac 的二进制 Java 7

java - 在给定 JDK 8 DateTimeFormatter 的情况下获取原始模式字符串?