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

Cor*_*air 14 java java-7 java-8 log4j2

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

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

这是代码:

public class Class1 {   
    private static Logger log = LogManager.getLogger(Class1.class); 
    ...
Run Code Online (Sandbox Code Playgroud)

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

使用JDK与版本7,一切正常.

Hol*_*ger 27

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

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

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

似乎Eclipse没有在没有找到类文件的引用和在" «classname»无法解析" 时无法读取的类文件之间产生差异.

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

  • @Jim:这是一个没有任何价值的声明.这个答案从**开始时使用JDK 8 ...**当然,当你不使用JDK 8时,以"当使用JDK 8 ..."开头的语句不适用. (5认同)
  • @Jim:我假设每个开发人员都能够使用旧的JDK/JRE,并且不需要关于此选项的特殊提示,也不需要如何做到这一点.与问题的最后一句比较; 提问者已经这样做以验证问题是否与JDK版本相关联. (4认同)
  • 只是为了完整性,如果编译器错误中提到的类是[`Map.Entry`](http://docs.oracle.com/javase/8/docs/api/java/util/Map.Entry,则同样适用. html)(在许多问题中)因为`interface`现在有`static`方法... (3认同)