【问题标题】:Eclipse oxygen gives syntax error warning in module-info fileEclipse 氧气在模块信息文件中给出语法错误警告
【发布时间】:2019-04-03 01:25:20
【问题描述】:

我正在尝试学习 JAVA 中模块的新概念。我正在使用 Eclipse 氧气 4.7.3aJDK 11.0.1

我的 module-info.java 文件出现语法错误警告。似乎编译器无法解析 module-info.java 文件的新关键字。

我执行了以下解决方案来解决此问题:

  1. 从 Eclipse JAVA 11 更新 URL 安装了所有 JAVA 11 更新:http://download.eclipse.org/eclipse/updates/4.9-P-builds

  2. eclipse.ini 文件中添加了 JVM 参数“--add-modules=java.se.ee”。

但问题仍然存在。任何建议/意见表示赞赏!

【问题讨论】:

  • report this to eclipse了吗?另外,您的module-info.java 的内容是什么,它在项目结构中的什么位置?
  • 您使用的 Eclipse 版本已过时且早于 Java 11。对于 Java 11,需要 Eclipse 2018-09 以及 Java 11 Support for Eclipse 2018-09 (4.9) 插件。 @nullpointer
  • @howlge,4.7.3a 是稳定的最新版本。我在这里交叉检查:eclipse.org/downloads/packages/release/oxygen。 4.7.3a 之后还有其他最新更新吗?
  • @nullpointer,module-info.java 文件是空的,只有模块声明。问题中附有相同的模块快照。
  • 新版本结束了对上一版本的维护。 Oxygen 紧随其后的是 Photon,随后是 2018-09(Java 11 在 2018-09 发布之后发布):eclipse.org/downloads/packages/release

标签: java eclipse module java-9 eclipse-oxygen


【解决方案1】:

Java 11 要求

或将于 2018 年 12 月 19 日发布的 Eclipse 2018-12 (4.10)。

Eclipse Oxygen 在 Eclipse Photon、Eclipse 2018-09 和 Java 11 之前发布,因此无法检测到 Java 11 JDK/JRE。

此外,Java 编译器合规级别必须设置为 9 或更高项目 > 属性:Java 编译器) 拥有一个具有自己语法的 module-info.java 文件,该语法已在 Java 9 中与 Java Platform Module System (JPMS) 一起引入。如果编译器合规级别低于 9,则标记 module 在开头.java 文件是语法错误,因为 module-info.java 是 Java

请注意eclipse.ini 中的设置是指用于运行 Eclipse 的 JRE/JDK。用于开发的 JRE 或更好(查看源代码)JDK 必须在 Window > Preferences: Java > Installed JREs 中指定。

【讨论】:

  • 这让我想知道,这种检测是如何工作的。如果需要针对每个新的 Java 版本进行调整,这似乎令人惊讶地不可靠。下面是我检测 Java 9+ 版本的方法: 1) 使用 jrt-fs.jar 打开包含的模块映像(当你想针对包含的类进行编译时,无论如何你都需要它) 2) 读取包含的java/lang/Object.class 及其类文件版本号。 3) 从那个数字中减去44。对于 Java 9 之前的环境,您必须打开 rt.jar 才能提取类文件。这适用于 JDK 1.1 到 JDK12ea。那么 Eclipse 会做什么呢?
  • 我猜主要问题是每个 .class 文件 (major version number: two bytes at offset 6 and 7) 的标题中包含的版本。不幸的是,即使类文件格式没有改变(据我所知,Java 10 (54) -> 11 (55) 就是这种情况),Java 类文件版本也会随着每个 Java 版本而递增。请注意,更高的类文件版本也可能意味着部分不仅是未知的,而且字节将被不同地解释。
  • 我指的是那个版本。 Eclipse 应该理解的最小值是 55 > 54(正如我之前的评论中所说,我什至假设减去 44 会给我们提供主要版本,直到被召回)。所以它应该理解比53 更新的类文件版本允许遵从级别910。如果它无法解析类文件,这是一个完全不同的问题,因为8 或更旧的合规级别无法解决该问题。与with this known issue比较。
  • @Holger 这仅在类格式向后兼容的情况下才有效,根据定义,它不是向后兼容的。例如,如果您忽略版本号,则可能是版本为60 的文件可以毫无问题地读取,但不正确(因为各个字节具有不同的含义)。
  • 正如链接答案中所指出的,Eclipse 以尝试着称,尽管数量更多。如果 Eclipse 只是报告“Unsupported JDK, version number xyz”,那没问题。但是 Eclipse 并没有这样做。它仍在尝试,有时甚至可以工作。但是回退到 Java 9 之前的合规级别,因为版本号高于 10,根本没有任何意义。而且它不会改变解析 JDK 的类文件的机会。当您更改项目的合规级别时,JDK 的类文件不会更改。
猜你喜欢
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多