Eclipse Oxygen 2 + Java 9 几分钟后显示错误
Eclipse Oxygen 2 + Java 9 shows errors after a few minutes
使用 Eclipse 进行 Java9 开发几分钟后,我开始看到只能通过重新启动 Eclipse 来解决的错误。在此之前,Java 9 支持完美运行。
我使用 Gradle 并通过 Buildship 导入项目
症状
通常一些 Java 工具交互失败,在最近的情况下 "References -> Workspace"。错误日志 window 中的堆栈跟踪是
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
在运行Javaconsole
时发现如下异常
追踪
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.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
环境
- 日食 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+Java9而升级)
这是由 Eclipse 错误 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/ and then downloading the JDT zip, e.g. org.eclipse.jdt-4.7.3aRC2.zip 找到最新的集成构建并通过添加新软件 -> 软件站点 -> 存档...
来添加它
使用 Eclipse 进行 Java9 开发几分钟后,我开始看到只能通过重新启动 Eclipse 来解决的错误。在此之前,Java 9 支持完美运行。
我使用 Gradle 并通过 Buildship 导入项目
症状
通常一些 Java 工具交互失败,在最近的情况下 "References -> Workspace"。错误日志 window 中的堆栈跟踪是
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
在运行Javaconsole
时发现如下异常
追踪
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.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
环境
- 日食 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+Java9而升级)
这是由 Eclipse 错误 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/ and then downloading the JDT zip, e.g. org.eclipse.jdt-4.7.3aRC2.zip 找到最新的集成构建并通过添加新软件 -> 软件站点 -> 存档...
来添加它