Eclipse jdk 11问题:无法解析类型java.lang.String。它是从所需的.class文件间接引用的

问题描述 投票:0回答:5

我有一个玩具程序,当我尝试使用 Chronicle 导入并编译到语言级别 11 时,它有一个编译错误 仅在 Eclipse 中。该程序在 maven 中编译并运行,也在 IntelliJ 中编译并运行(使用相同的 maven和 JDK)。

我拥有的版本是:

  • 行家3.6.1
  • jdk openjdk版本“11”2018-09-25
  • 日食 2020-03-R
  • chronicle-bom 2.19.199(从 2.17 开始支持 java11)

这是我的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

但我不明白我的构建路径中存在什么问题:

enter image description here

此外,我可以看到 java.lang 存在于包资源管理器中:

enter image description here

(请注意,如果我将语言级别更改为 8,但仍然使用 JDK 11,它将在 Eclipse 中工作。)

我已经检查了明显的问题(构建路径、maven/jdk 路径),一切对我来说都是正确的。 为什么我在 Eclipse 中收到此错误以及如何修复它?

java eclipse java-11 openjdk-11
5个回答
4
投票

完整的错误消息是:

  • 类型 java.lang.String 从所需的 .class 文件间接引用,但由于声明包 java.lang 已导出而无法解析 来自模块 java.base 与可从模块访问的包冲突

这是由传递依赖项之一 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 编译器就会停止抱怨。


1
投票

打开后错误解决了 窗口 > 首选项:Java > 安装的 JRE > 执行环境 并重新选择JavaSE-11,应用并关闭


0
投票

在我的例子中,我遇到了以下错误,并且它与“配置构建路径”没有关系--

The type java.io.FilterOutputStream cannot be resolved. It is indirectly referenced from required .class files

enter image description here

我创建了一个包并将有问题的类定位到该类中后,该错误得到了解决。


0
投票

安装支持 jdk-22 的最新版本 Eclipse(即 Eclipse 2024-06 R)。因此,您还必须安装 jdk-22 。在构建路径上设置 jdk 现在您就可以出发了。


-1
投票

它与 pom 文件不匹配,因此也在 pom 文件中更新。

<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>

我用过这两个,对我来说效果很好。

© www.soinside.com 2019 - 2024. All rights reserved.