java.util.Map $ Entry无法解析。 JDK 1.8

时间:2017-09-20 02:20:55

标签: java maven java-8

我的java应用程序引用了一组jar,它们都是用jdk 1.6和maven 2.2.1构建的。 对于特定功能,需要将我们的Java版本升级到1.8。所以,我试图将我的应用程序指向jdk 1.8.0_144并尝试运行它。我收到以下错误:

* stderr:注释处理被禁用,因为它需要1.6兼容的JVM java.util.Map $ Entry类型无法解析。它是从所需的.class文件

间接引用的

注意:应用程序和依赖jar仍然使用jdk 1.6构建(依赖jar是遗留代码,我更喜欢不用新的java版本编译)

我错过了什么? 我读了一些需要Eclipse升级的解决方案。但是,这不是直接看起来像是问题的日食。 我还遇到了一些关于升级ecj.jar的讨论。但是,我不确定我是否需要这样做。

非常感谢所有帮助。

1 个答案:

答案 0 :(得分:2)

有明显迹象表明您已在使用Java 8环境。消息“注释处理已禁用,因为它需要1.6兼容的JVM ”表示生成此消息的工具无法将JVM识别为“1.6兼容”,这是工具失败的典型标志识别“1.8兼容”JVM与1.6兼容。

此外,您在this comment中引用了

的错误消息
  

在'java.lang.annotation.Retention'类型中找不到注释方法'value()':错误的类文件:java / lang / annotation / Retention.class(java / lang / annotation:Re tention.class)类文件有错误的版本52.0,应该是50.0。

这表明您具有Java 8环境,因为<pre>是JRE的一部分,并且报告具有版本52.但是生成此错误消息的工具不支持处理该版本号的类文件。在这种特定情况下,它不是ECJ,因为较旧的ECJ版本试图处理忽略较高版本号的类文件,并且只有当它们遇到他们不理解的特征时才会挽救(如this answer中所述)。 / p>

这背后有一个普遍的模式。您不仅需要使用嵌入式编译器(如Tomcat或Eclipse或具体的编译器ECJ)更新工具,还必须更新执行字节代码处理的每个工具。

很多工具都在像ASM那样处理字节码处理库,所以更新ASM可以解决很多问题,但是,不值得通过链中的所有工具来判断它们是否进行字节码处理以及他们是直接实现还是使用其他库实现它,只是为了发现在更新该工具后还有其他工具存在问题。

相反,完全更新maven,包括所有插件。只更新少数几个图书馆并保持其他一切处于古老状态并不值得。并更新您可能尚未提及的链中的所有工具。