最直接可靠的方式是读取系统属性 java.version,它返回jvm实际使用的jdk版本字符串(如"17.0.1");java 9起推荐使用 runtime.version() 获取结构化版本对象,支持语义化解析与比较。

Java代码中获取运行时JDK版本信息,最直接可靠的方式是读取系统属性 java.version,它返回的是JVM实际使用的JDK版本号字符串(如 "17.0.1" 或 "21.0.2")。Java 9起还提供了更结构化的 Runtime.version() 方法,支持语义化解析和比较。
使用 System.getProperty("java.version")
这是兼容性最好、最常用的方式,适用于所有Java版本(包括Java 8及更早):
- 返回值为字符串,格式通常为
主版本号.次版本号.修订号(如"1.8.0_381"、"17.0.2"、"21.0.1") - 注意:该值由JVM启动时决定,与编译时JDK无关
- 示例代码:
String version = System.getProperty("java.version");
System.out.println(version); // 输出类似 "21.0.2"
使用 Runtime.version()(Java 9+)
从Java 9开始推荐使用,返回 Runtime.Version 对象,支持版本比较、提取主次版本等:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 可调用
version.major()、version.minor()、version.security()获取各段数字 - 支持语义化比较:
Runtime.version().compareTo(Runtime.version().parse("21")) >= 0 - 示例代码:
Runtime.Version version = Runtime.version();
System.out.println(version.major()); // 输出 21
System.out.println(version.toString()); // 输出 "21.0.2+13"
区分编译版本与运行版本
容易混淆但很重要:代码编译时的JDK版本(由 javac 决定)≠ 运行时JDK版本(由 java 决定):
-
java.version和Runtime.version()反映的是 当前JVM运行所用的JDK版本 - 若需检查编译目标版本,可读取
System.getProperty("java.specification.version")(如"17"),但它仅表示JVM支持的Java SE规范版本,不完全等同于JDK发行版 - 跨版本兼容场景下(如用JDK 17编译、在JDK 21上运行),务必以运行时版本为准
常见陷阱与建议
避免因版本判断逻辑出错导致兼容性问题:
- 不要用
String.startsWith("1.8")判断Java 8——Java 9+已弃用1.8前缀,应统一用Runtime.version().major() >= 8 - 避免硬编码版本字符串比较,优先使用
Runtime.Version的compareTo方法 - 若需支持Java 8及以下,必须回退到
System.getProperty("java.version")并手动解析(可用正则提取主版本)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










