最可靠的方式是调用 runtime.version() 获取 jdk 版本,它返回结构化 version 对象,支持语义化比较且不受环境变量干扰;system.getproperty("java.version") 兼容性好但格式不统一;命令行 java -version 不可靠,可能指向非当前 jvm。

Java程序运行时最可靠的方式是通过 JVM 自身提供的 API 获取真实加载的 JDK 版本,而不是依赖外部命令或环境变量。因为只有运行时实际启动的 JVM 才决定字节码兼容性、API 可用性和行为表现。
用 Runtime.version() 获取结构化版本信息(推荐 JDK 9+)
这是目前最规范、最健壮的方式。它返回一个 Runtime.Version 对象,支持语义化比较,不受 JAVA_HOME 或 IDE 设置干扰。
- 调用
Runtime.version().toString()得到类似"17.0.2+8-86"的字符串 - 用
Runtime.version().feature()直接获取主版本号(如 17、21),适合做版本判断 - 支持
compareTo()方法,可安全比较高低版本:Runtime.version().compareTo(Runtime.version().parse("21")) >= 0
用 System.getProperty("java.version") 获取兼容字符串
适用于所有 JDK 版本,但格式不统一:JDK 8 返回 "1.8.0_351",JDK 17 返回 "17.0.2"。直接字符串截取容易出错。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 适合日志记录或简单展示:
System.getProperty("java.version") - 若需解析主版本,建议配合
Runtime.version().feature()使用,避免手动拆分 - 该值由 JVM 启动时固化,准确反映当前运行环境
避免依赖命令行 java -version
虽然可用 ProcessBuilder 调用 java -version,但它输出到 stderr,且返回的是 PATH 中首个 java 可执行文件的版本——未必是当前程序运行所用的 JVM。
- 在容器或 CI 环境中,
java -version可能指向另一个 JDK - 必须重定向 stderr 并捕获输出,代码更复杂、跨平台风险高
- 仅在特殊场景(如启动器校验宿主机 JDK)下才考虑使用
注意编译与运行版本分离问题
javac 编译出的 class 文件有版本号(如 major version 61 → JDK 17),但运行时是否能加载,取决于实际 JVM 版本。仅靠 javac -version 或 pom.xml 中的 <source></source> 配置无法保证运行一致。
- 运行时报
UnsupportedClassVersionError说明运行时 JDK 版本低于编译版本 - 真正关键的是
Runtime.version()—— 它是唯一 100% 反映代码执行现场的依据 - 建议在应用启动时打印该值,用于故障排查和环境审计
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










