使用Amazon Corretto JDK17搭配Chronicle遇NoSuchMethodError问题求助
sun.misc.Cleaner方法缺失问题 我按照Chronicle官方博客的指南完成了Jar包升级,并添加了以下JVM参数:
JDK17_VM_ARGS="-Dio.netty.tryReflectionSetAccessible=true --add-exports=java.base/jdk.internal.ref=ALL-UNNAMED --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED " DEFAULT_VM_ARGS="-XX:+UseParallelGC -Xms16g -Xmx16g -XX:NewRatio=3 -XX:MaxGCPauseMillis=500"
但使用Amazon Corretto JDK17时,仍抛出如下异常:
ERROR: 未捕获异常: chronicle-source-1
java.lang.NoSuchMethodError: 'sun.misc.Cleaner sun.nio.ch.DirectBuffer.cleaner()'
at net.openhft.lang.io.VanillaMappedBytes.cleanup(VanillaMappedBytes.java:95) ~[lang-6.8.2.jar:?]
at net.openhft.lang.io.AbstractBytes.release(AbstractBytes.java:646) ~[lang-6.8.2.jar:?]
at net.openhft.lang.io.VanillaMappedBytes.release(VanillaMappedBytes.java:86) ~[lang-6.8.2.jar:?]
at net.openhft.lang.io.VanillaMappedBlocks.acquire0(VanillaMappedBlocks.java:63) ~[lang-6.8.2.jar:?]
at net.openhft.lang.io.VanillaMappedBlocks.acquire(VanillaMappedBlocks.java:57) ~[lang-6.8.2.jar:?]
at net.openhft.chronicle.IndexedChronicle$AbstractIndexedExcerpt.setDataBuffer(IndexedChronicle.java:515) ~[chronicle-3.6.4.jar:?]
at net.openhft.chronicle.IndexedChronicle$AbstractIndexedExcerpt.indexForRead(IndexedChronicle.java:440) ~[chronicle-3.6.4.jar:?]
at net.openhft.chronicle.IndexedChronicle$IndexedExcerptTailer.index(IndexedChronicle.java:964) ~[chronicle-3.6.4.jar:?]
at net.openhft.chronicle.tcp.SourceTcp$IndexedSessionHandler.write(SourceTcp.java:551) ~[chronicle-3.6.4.jar:?]
at net.openhft.chronicle.tcp.SourceTcp$SessionHandler.onWrite(SourceTcp.java:365) ~[chronicle-3.6.4.jar:?]
at net.openhft.chronicle.tcp.SourceTcp$SessionHandler.onSelectionKey(SourceTcp.java:327) ~[chronicle-3.6.4.jar:?]
at net.openhft.chronicle.tcp.SourceTcp$SessionHandler.vanillaNioLoop(SourceTcp.java:245) ~[chronicle-3.6.4.jar:?]
at net.openhft.chronicle.tcp.SourceTcp$SessionHandler.run(SourceTcp.java:195) ~[chronicle-3.6.4.jar:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?]
at java.lang.Thread.run(Thread.java:833) [?:?]
解决方案
- 升级依赖版本:当前使用的
lang-6.8.2.jar和chronicle-3.6.4.jar版本过旧,未适配JDK17的内部API变更。需将Chronicle Lang升级至7.x及以上版本,Chronicle Core升级至4.x及以上版本(优先选择官方标注支持JDK17的稳定版)。 - 验证JVM参数生效:确认启动脚本中已正确合并
JDK17_VM_ARGS与DEFAULT_VM_ARGS,确保所有--add-exports/--add-opens参数都被传递给JVM进程。 - 适配Corretto JDK特性:Amazon Corretto JDK17对内部API的访问限制与标准OpenJDK一致,无需额外配置,但需确保依赖版本已完成JDK17兼容适配。
内容的提问来源于stack exchange,提问作者NimChimpsky

