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

将LogManager(l4j2)与Java 8一起使用时出错(无法解析Java.lang.reflect.AnnotateDelete),java,java-7,java-8,log4j2,Java,Java 7,Java 8,Log4j2,我刚刚在将我的一个新项目的JDK版本从7u45切换到8u20时遇到了一个奇怪的错误。拒绝类开头的无害LogManager声明,错误如下: 无法解析类型java.lang.reflect.AnnotateDelete。它是从必需的.class文件间接引用的 代码如下: public class Class1 { private static Logger log = LogManager.getLogger(Class1.class); ... Eclipse建议我配置构

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

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

代码如下:

public class Class1 {   
    private static Logger log = LogManager.getLogger(Class1.class); 
    ...
Eclipse建议我配置构建路径,但我不知道配置什么,因为我不知道该错误的根本问题


在版本7中使用JDK,一切正常

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

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

有时,当旧编译器忽略类文件的较新版本号时,您可以不受影响。但是一些类型会混淆旧的类文件解析器,因为它们使用新的特性,特别是现在有默认方法的特性,以及现在有静态方法的接口

对于找不到类文件的引用和在说“«classname»无法解析”时读不到的类文件,Eclipse似乎没有区别


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

如果在Eclipse中运行的Tomcat中发生这种情况,请转到Preferences→ 服务器→ 运行时环境→ Tomcat版本→ 编辑…并确保所选JRE与Tomcat版本匹配。也许您需要安装一个。

我将JRE 8更改为JRE 7,然后重新启动Eclipse,然后它就可以正常工作。

我将Eclipse Helios与JRE 8一起使用,并更新软件以解决问题

现在我正在使用Eclipse Mars,工作正常->

解决方案1:

尝试更改源级别

转到项目>首选项>Java编译器。 启用特定于项目的设置 将编译器符合性级别设置为1.4或更低。 重新启动 解决方案2:

创建一个新的工作区。 将项目文件复制到新工作区中。 将项目导入eclipse并重新生成。
为了完整起见,如果编译器错误中提到的类在很多问题中都存在,那么同样适用,因为该接口现在有静态方法……您不必更新IDE。您还可以安装旧的JDK/JRE,并指定Eclipse使用旧版本窗口>首选项>已安装的JRE。例如,我在那里指定了C:\Program Files\Java\jdk1.7.0\U 67\jre,错误消失了。@Jim:这是一条毫无价值的语句。这个答案从使用JDK 8开始…当然,当您不使用JDK 8时,以“使用JDK 8时…”开头的语句不适用。@Holger当Java在我的开发机器上更新时,我就遇到了这种情况。在这种情况下,切换到1.8 JRE并不是一个刻意的选择,而切换回来是一个手动步骤。您的答案很好,但没有提到使用JDK 8的替代方案。我的评论是对您所说的内容的补充:如果您正在使用JDK 8,请更新IDE。如果您未使用或未使用JDK 8,则无需更新IDE-您只需指定不同的JRE即可。@Jim:我假设每个开发人员都能够在较旧的JDK/JRE上使用,并且不需要关于此选项或如何操作的特殊提示。与问题的最后一句进行比较;提问者已经这样做了,以验证问题是否与JDK版本有关。对于如何实际纠正问题,提供实际建议,做得很好!