我有一个玩具程序,当我尝试使用 Chronicle 导入并编译到语言级别 11 时,它有一个编译错误 仅在 Eclipse 中。该程序在 maven 中编译并运行,也在 IntelliJ 中编译并运行(使用相同的 maven和 JDK)。
我拥有的版本是:
这是我的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>testjava11</groupId>
<artifactId>chronicle-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>net.openhft</groupId>
<artifactId>chronicle-bom</artifactId>
<version>2.19.199</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>net.openhft</groupId>
<artifactId>chronicle-map</artifactId>
</dependency>
</dependencies>
</project>
这是我的简单测试类:
import net.openhft.chronicle.bytes.BytesMarshallable;
public class App {
public static void main(String[] args) {
System.out.println("BytesMarshallable: " + new BytesMarshallable() {});
}
}
直接用maven运行exec:java时的输出是
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------------< testjava11:chronicle-test >----------------------
[INFO] Building chronicle-test 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ chronicle-test ---
[INFO] Deleting C:\Users\eclipse-workspace\chronicle-test\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ chronicle-test ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ chronicle-test ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent!
[INFO] Compiling 1 source file to C:\Users\eclipse-workspace\chronicle-test\target\classes
[INFO]
[INFO] --- exec-maven-plugin:3.0.0:java (default-cli) @ chronicle-test ---
BytesMarshallable: App$1@309d6b5b
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.400 s
[INFO] Finished at: 2020-06-11T15:04:53+02:00
[INFO] ------------------------------------------------------------------------
它在 IntelliJ 中编译,这是我作为 Java 应用程序运行时的输出:
BytesMarshallable: App$1@39fb3ab6
Process finished with exit code 0
但是,在 Eclipse 中 App 类将无法编译。 错误出现在导入行并显示:
The type java.lang.String cannot be resolved. It is indirectly referenced from required .class files
“问题”面板中还有一条附加消息:
The project was not built since its build path is incomplete.
Cannot find the class file for java.lang.String.
Fix the build path then try building this project
但我不明白我的构建路径中存在什么问题:
此外,我可以看到 java.lang 存在于包资源管理器中:
(请注意,如果我将语言级别更改为 8,但仍然使用 JDK 11,它将在 Eclipse 中工作。)
我已经检查了明显的问题(构建路径、maven/jdk 路径),一切对我来说都是正确的。 为什么我在 Eclipse 中收到此错误以及如何修复它?
完整的错误消息是:
这是由传递依赖项之一 net.openhft:affinity:3.2.3 引起的,嵌入了 java.lang 包中的 2 个类,这是非法的。 Eclipse 中的 ECJ 编译器会抱怨这一点是意料之中的。然而,它在 javac 中工作的事实本身就是一个错误:https://bugs.openjdk.java.net/browse/JDK-8215739
有一个相关性问题:https://github.com/OpenHFT/Java-Thread-Affinity/issues/58
如果您不使用线程亲和性功能,只需从依赖项中排除亲和性,Eclipse 编译器就会停止抱怨。
打开后错误解决了 窗口 > 首选项:Java > 安装的 JRE > 执行环境 并重新选择JavaSE-11,应用并关闭
安装支持 jdk-22 的最新版本 Eclipse(即 Eclipse 2024-06 R)。因此,您还必须安装 jdk-22 。在构建路径上设置 jdk 现在您就可以出发了。
它与 pom 文件不匹配,因此也在 pom 文件中更新。
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
我用过这两个,对我来说效果很好。