Eclipse Oxygen 2 + Java 9在几分钟后显示错误

时间:2018-03-01 09:56:56

标签: java eclipse java-9 eclipse-oxygen

使用Eclipse进行Java 9开发几分钟后,我开始看到只能通过重新启动Eclipse来解决的错误。在此之前,Java 9支持可以完美运行。

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

症状

通常,某些Java工具交互失败,在最近的情况下是“引用 - >工作区”。错误日志窗口中的堆栈跟踪是

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
  • 在Windows 7上运行的Java 9.0.4 64位
  • Gradle 4.6rc2
  • Buildship:2.2.2.v20180209-2313-s(升级因为4.7.2 buildship不支持Gradle + Java 9)

1 个答案:

答案 0 :(得分:0)

这是由Eclipse bug 525842引起的。

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

在撰写本文时,此错误已在M7光子构建中修复,并且还向后移植到Oxygen版本3。

但它似乎不在Oxygen 3或Photon M7 zip文件中。可以通过从http://download.eclipse.org/eclipse/downloads/查找最新的集成版本然后下载JDT zip来添加它,例如: org.eclipse.jdt-4.7.3aRC2.zip并通过添加新软件进行安装 - >软件站点 - >归档...