在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:
尝试更改来源级别。
- 转到项目>首选项> Java编译器。
- 启用项目特定设置
- 将编译器合规性级别设置为1.4或更低。
- 重新开始
解决方案2:
- 创建一个新的工作区。
- 将项目文件复制到新的工作区中。
- 导入项目到Eclipse和重建。