You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未使用Java模块却触发模块相关异常(Chronicle Queue+Java 17)

问题描述

我使用Chronicle Queue的示例代码,配合Java 17在IntelliJ中运行时抛出模块相关异常,但我并没有使用Java模块系统(没有module.info文件)。

示例代码

import net.openhft.chronicle.core.OS;
import net.openhft.chronicle.queue.ChronicleQueue;
import net.openhft.chronicle.queue.ExcerptAppender;
import net.openhft.chronicle.queue.ExcerptTailer;

public class ChronicleQueueTutorial {

    public static void main(String[] args) {
        String basePath = OS.getTarget() + "/getting-started";
        System.out.println("Base path: " + basePath);
        try (ChronicleQueue queue = ChronicleQueue.singleBuilder(basePath).build()) {
            ExcerptAppender appender = queue.acquireAppender();
            appender.writeText("TestMessage");
            ExcerptTailer tailer = queue.createTailer();
            System.out.println(tailer.readText());
        }
    }

}

Maven配置(pom.xml)

<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>ChronicleTutorial</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>net.openhft</groupId>
            <artifactId>chronicle-queue</artifactId>
            <version>5.23ea25</version>
        </dependency>
    </dependencies>
</project>

抛出的异常

Exception in thread "main" java.lang.ExceptionInInitializerError
    at net.openhft.chronicle.core.Jvm.getSetAccessible0Method(Jvm.java:232)
    at net.openhft.chronicle.core.Jvm.&lt;clinit&gt;(Jvm.java:132)
    at net.openhft.chronicle.core.OS.&lt;clinit&gt;(OS.java:48)
    at ChronicleQueueTutorial.main(ChronicleQueueTutorial.java:9)
Caused by: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at net.openhft.chronicle.core.Jvm.getSetAccessible0Method(Jvm.java:228)
    ... 3 more
Caused by: java.lang.IllegalAccessException: module java.base does not open java.lang.reflect to unnamed module @39ed3c8d
    at java.base/java.lang.invoke.MethodHandles.privateLookupIn(MethodHandles.java:259)
    ... 8 more
问题解答

原因分析

Java 9及以上版本的模块系统,即使代码没有显式创建module.info文件,所有未归属到显式模块的代码都会被自动归类到**未命名模块(unnamed module)**中。而Chronicle Queue库内部使用反射机制,尝试访问java.base模块中受保护的java.lang.reflect包内容,Java 17进一步收紧了模块访问权限,默认不允许未命名模块访问这些受限API,因此抛出IllegalAccessException。

解决方法

  1. 添加JVM启动参数:在IntelliJ的运行配置中,添加以下参数,允许未命名模块访问java.base的java.lang.reflect包:

    --add-opens java.base/java.lang.reflect=ALL-UNNAMED
    

    操作步骤:打开Run/Debug Configurations → 选择目标运行配置 → 在VM options中填入上述参数。

  2. 更换兼容版本的Chronicle Queue:当前使用的5.23ea25是预览版本,可能存在Java 17的兼容问题。建议更换为官方发布的稳定版本,这类版本通常会修复模块访问相关的适配问题。

  3. 降级Java版本:如果暂时无法调整依赖或启动参数,可以尝试使用Java 11(LTS版本),该版本的模块访问限制相对宽松,能兼容旧版Chronicle Queue的反射逻辑。

内容的提问来源于stack exchange,提问作者user3573403

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:57:36