未使用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.<clinit>(Jvm.java:132) at net.openhft.chronicle.core.OS.<clinit>(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。
解决方法
添加JVM启动参数:在IntelliJ的运行配置中,添加以下参数,允许未命名模块访问
java.base的java.lang.reflect包:--add-opens java.base/java.lang.reflect=ALL-UNNAMED操作步骤:打开Run/Debug Configurations → 选择目标运行配置 → 在VM options中填入上述参数。
更换兼容版本的Chronicle Queue:当前使用的
5.23ea25是预览版本,可能存在Java 17的兼容问题。建议更换为官方发布的稳定版本,这类版本通常会修复模块访问相关的适配问题。降级Java版本:如果暂时无法调整依赖或启动参数,可以尝试使用Java 11(LTS版本),该版本的模块访问限制相对宽松,能兼容旧版Chronicle Queue的反射逻辑。
内容的提问来源于stack exchange,提问作者user3573403
相关产品推荐
相关产品推荐

