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

当我将一个新项目的JDK版本从7u45切换到8u20时,我遇到了一个奇怪的错误。 在我的课程开始时,一个无害的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功能,也必须将IDE更新为支持Java 8的版本。

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

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

看来Eclipse并没有在没有找到类文件的引用和没有读“ classname ”时无法读取的类文件之间产生区别“。

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

我从JRE 8更改为JRE 7并重新启动Eclipse,然后它工作正常。

我使用Eclipse Helios与JRE 8并更新软件解决了这个问题。

现在我正在使用Eclipse Mars,工作正常 – > https://eclipse.org/downloads/

解决方案1:

尝试更改来源级别。

  1. 转到项目>首选项> Java编译器。
  2. 启用项目特定设置
  3. 将编译器合规性级别设置为1.4或更低。
  4. 重新开始

解决方案2:

  1. 创建一个新的工作区。
  2. 将项目文件复制到新的工作区中。
  3. 导入项目到Eclipse和重建。