几分钟后,Eclipse Oxygen 2 + Java 9 出现错误

3

使用Eclipse进行Java 9开发几分钟后,我开始看到只有重新启动Eclipse才能解决的错误。在此之前,Java 9支持完美无缺。

我使用Gradle,并通过Buildship导入项目。

症状

通常会出现一些Java工具交互失败的情况,最近的一个例子是"References -> Workspace"。错误日志窗口中的堆栈跟踪如下:

java.lang.NullPointerException
    at org.eclipse.jdt.internal.compiler.lookup.BinaryModuleBinding.create(BinaryModuleBinding.java:64)
    at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.getModuleFromAnswer(LookupEnvironment.java:427)
    at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.askForTypeFromModules(LookupEnvironment.java:367)

之后,从编辑文件触发的任何编译都会导致神秘错误,例如:

The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files

研究/尝试过的事情

  • 创建一个新的工作空间
  • 移除并重新导入项目
  • Eclipse bug 526206 看起来很相似,但那是针对4.7.1。我正在使用4.7.2

  • 运行Java控制台时发现以下异常

跟踪

Caused by: java.nio.channels.ClosedByInterruptException
        at java.base/java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:199)
        at java.base/java.nio.channels.Channels$ReadableByteChannelImpl.read(Channels.java:386)
        at jdk.internal.jrtfs.JrtFileSystem$1.read(JrtFileSystem.java:376)
        at java.base/sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:65)
        at java.base/sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:109)
        at java.base/sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103)
        at java.base/java.nio.file.Files.read(Files.java:3160)
        at java.base/java.nio.file.Files.readAllBytes(Files.java:3213)
        at org.eclipse.jdt.internal.compiler.util.JrtFileSystem.getClassfileBytes(JRTUtil.java:330)
        at org.eclipse.jdt.internal.compiler.util.JrtFileSystem.getClassfileContent(JRTUtil.java:311)
        at org.eclipse.jdt.internal.compiler.util.JRTUtil.getClassfileContent(JRTUtil.java:153)
        at org.eclipse.jdt.internal.core.AbstractClassFile.getClassFileContent(AbstractClassFile.java:187)

eclipse.ini

我发现各种解决方案都涉及更改eclipse.ini中的--add-modules行,但是4.7.2版本已经默认包含了--add-modules=ALL-SYSTEM。 我唯一对eclipse.ini进行的微调是添加了-vm参数以指向Java 9 JDK。

-vm
C:/adam/apps/jdk-9.0.4_windows-x64_bin/bin/javaw.exe

环境

  • Eclipse 4.7.2
  • Java 9.0.4 64位,运行在Windows 7系统上
  • Gradle 4.6rc2
  • Buildship: 2.2.2.v20180209-2313-s(升级版,因为4.7.2版本的Buildship不支持Gradle + Java 9)

我不是很清楚,但是如果改用java而不是javaw会有帮助吗?另外我想已经有4.7.3版本了 - 你可以试试其中的一个。 - Eugene
2
可能存在 bug 529367 - greg-449
@Eugene java.exe 是不必要的。C:/adam/apps/jdk-9.0.4_windows-x64_bin/bin 就足够了。 - ZhekaKozlov
谢谢您的建议。我已经尝试了Java和Javaw。不幸的是,尽管我已经回到了最初的设置,但现在问题似乎已经“消失”了。 - Adam
1个回答

0

这是由于Eclipse bug 525842引起的。

简而言之,当涉及到Eclipse JDT从JEP 220中引入的新Java 9运行时文件系统中读取时,会发生某种交互。 Eclipse使用Thread.interrupt()中断线程,导致java.nio.channels.ClosedByInterruptException,这是没有人预料到的。这会破坏JDT和所有后续操作。执行后台编译的批处理编译器似乎不受此问题的影响。

在撰写本文时,此错误已在M7 photon版本中得到修复,并已回溯到Oxygen release 3。

然而,在 Oxygen 3 或 Photon M7 的 zip 文件中似乎没有它。可以通过从 http://download.eclipse.org/eclipse/downloads/ 找到最新的集成构建,然后下载 JDT zip(例如 org.eclipse.jdt-4.7.3aRC2.zip),并通过“添加新软件” -> “软件站点” -> “存档...”进行安装。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接