【问题标题】:java.util.Map$Entry cannot be resolved. JDK 1.8java.util.Map$Entry 无法解析。 JDK 1.8
【发布时间】:2017-09-20 02:20:54
【问题描述】:

我的 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 的讨论。但是,我不确定是否需要这样做。

非常感谢所有帮助。

【问题讨论】:

  • 这还不够,它什么也没做。这就是为什么你仍然使用 java 6 但依赖 JAVA_HOME 的东西使用 java 8 的问题
  • JAVA_HOME 被 Tomcat 和各种 IDE 使用,但不被 Java 使用。您根本不需要为 Java 设置 CLASSPATH,如果您将其设置为包含一些 Java 安装,请删除它的那部分。并确保 PATH 变量包含对 Java 1.8 bin 目录的引用,而不是早期版本。
  • 它期望版本 50 的事实清楚地证明您正在运行 1.6,而不是 1.8。
  • 看,如果您收到消息“类文件的版本错误 52.0,应该是 50.0”,那么这是一个事实,您使用 java 8 和 java 6 编译的类。不可能得到该消息使用 java 8.
  • java/lang/annotation/Retention 是 JRE 的一部分。如果报52版本,那么 Java 8。问题是工具也不能处理class文件,还是老版本ECJ,或者链中还有另一个字节码处理工具。这完全符合问题的原始错误消息,其中工具抱怨找不到“符合 1.6 的 JVM”,没有意识到 JVM 符合 1.8,因此支持 1.6 的所有功能

标签: java maven java-8


【解决方案1】:

有明显迹象表明您已经在使用 Java 8 环境。消息“Annotation processing has been disabled, since it requires a 1.6 compatible 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) class 文件的 52.0 版本错误,应该是 50.0。

这表明您有一个 Java 8 环境,因为java.lang.annotation.Retention 是 JRE 的一部分,据报道其版本为 52。但生成此错误消息的工具不支持处理该版本号的类文件。在这种特定情况下,它不是 ECJ,因为较旧的 ECJ 版本会尝试处理忽略更高版本号的类文件,并且只有在遇到他们不理解的功能时才会退出(如 this answer 中所述)。

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

很多工具都在使用 ASM 之类的字节码处理库,因此更新 ASM 可以解决很多问题,但是,不值得遍历链中的所有工具并推理它们是否进行字节码处理以及他们是直接实现它还是使用另一个库,只是为了发现另一个工具在更新后有问题。

相反,完全更新 maven,包括所有插件。只更新几个库并将其他所有内容保持在那个古老的状态是没有回报的。并更新您可能尚未提及的链中的所有工具。

【讨论】:

  • Holger,有没有办法在不升级 ECJ 或任何其他工具的情况下直接解决第一个错误?我也尝试使用最新版本的 ECJ,但类版本错误仍然存​​在。这使您可以完全升级 maven,而不是尝试不同的工具。升级 maven 需要构建所有应用程序和遗留代码。那是你的建议吗?我还需要使用 Java 1.8 构建吗?这是否还需要使用最新的 ECJ?
  • 第一个错误应该可以通过更新产生引用错误消息的工具来解决。但我怀疑这是否足以解决所有问题,看起来您最终会使用另一个工具产生另一个错误消息。我不明白为什么升级 Maven 应该“需要构建所有应用程序和遗留代码”,因为 Maven 不依赖于您的代码。我想说的是,在普通设置中,Maven 附带的 ECJ 应该会在您升级所有内容时自动更新。此外,应该不需要自己构建它,使用预构建的二进制文件应该没问题。
猜你喜欢
  • 2014-12-29
  • 2015-06-07
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
相关资源
最近更新 更多