Java 21中com.sun.tools.attach.VirtualMachine类未找到问题修复
问题修复与原因解析
一、警告与异常的根本原因
1. 警告WARNING: package jdk.attach not in java.base的原因
你参考的Java 11文档信息不适用于Java 21:Java 21中jdk.attach包已从java.base模块迁移到独立的jdk.attach模块。你的启动命令中指定--add-opens java.base/jdk.attach=ALL-UNNAMED,但该包实际不在java.base里,因此触发警告。
2. ClassNotFoundException: com.sun.tools.attach.VirtualMachine的原因
你使用的是eclipse-temurin:21-jre-jammy镜像,这是JRE(Java运行时环境),而com.sun.tools.attach.VirtualMachine属于JDK(Java开发工具包)专属的jdk.attach模块,JRE默认不包含该模块及相关工具类,导致类加载失败。
二、修复方案
方案1:切换到JDK镜像(推荐)
将Docker镜像替换为JDK版本,它包含完整的jdk.attach模块及所需工具类:
eclipse-temurin:21-jdk-jammy
方案2:修正启动参数(配合JDK镜像使用)
同时调整启动命令中的--add-opens参数,匹配Java 21的模块结构,并且补充主类到命令末尾:
java -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints \ --add-opens java.base/jdk.internal.misc=ALL-UNNAMED \ --add-opens java.base/java.lang=ALL-UNNAMED \ --add-opens java.base/java.nio=ALL-UNNAMED \ --add-opens java.base/sun.nio.ch=ALL-UNNAMED \ --add-opens jdk.attach/jdk.attach=ALL-UNNAMED \ -Djdk.attach.allowAttachSelf -cp myapp.jar com.myns.cli
三、额外说明
clj-async-profiler依赖JDK的Attach API实现进程内性能分析,因此必须运行在JDK环境中,JRE无法满足其依赖需求。
内容的提问来源于stack exchange,提问作者user51
相关产品推荐
相关产品推荐

