提取Java主版本号最可靠的方式是使用Runtime.version().major()(Java 9+),否则可对version字符串用正则提取开头数字或按点分割后特殊处理1.8格式。

Java版本字符串中提取主版本号,关键是识别标准格式并正确切分。官方版本号格式为 主版本.次版本.修订号(如 17.0.1)或带更新/构建信息的扩展形式(如 11.0.22+8-LTS),主版本始终是第一个点号前的数字部分。
识别标准格式与常见变体
Java运行时返回的版本字符串(通过 System.getProperty("java.version") 获取)可能有多种写法:
-
17.0.1→ 主版本是 17 -
11.0.22+8-LTS→ 主版本仍是 11(+和-后内容属于构建/标签信息,不参与主版本解析) -
1.8.0_391→ 这是旧式JDK 8格式,主版本是 1(注意不是8;该格式中1.8表示 JDK 8,但按语义主版本仍为1,不过实际开发中通常将1.8视为等价于8;Java 9起已统一为单主版本号)
用 split 提取最简方案
对大多数现代Java版本(9+),直接按点号分割取首段即可:
String version = System.getProperty("java.version");
String major = version.split("\.")[0]; // 注意转义点号
// 结果如 "17"、"21"、"11"
该方法适用于 17.0.1、21.0.2+13 等主流格式。但对 1.8.0_391 会得到 "1",需额外判断是否为旧版并映射(例如:若首段为 "1" 且第二段为 "8",则主版本应为 8)。
立即学习“Java免费学习笔记(深入)”;
更健壮的正则提取方式
用正则匹配开头连续数字,能兼容所有格式:
String version = System.getProperty("java.version");
String major = version.replaceAll("(\d+).*", "$1");
// 或更精确地:version.replaceFirst("^(\d+)(?:\.\d+)*.*$", "$1")
这种写法忽略后续结构,只捕获版本字符串最开头的数字序列,对 1.8.0_391 得到 "1",对 8u391(某些旧发行版)则不适用——但JDK官方版本字符串不会出现 8u 形式,此格式多见于第三方打包,不在标准解析范围内。
推荐做法:优先使用 Runtime.version()(Java 9+)
Java 9 引入了 Runtime.version(),返回 Runtime.Version 对象,可直接获取主版本整数:
int major = Runtime.version().major(); // 返回 int 类型的主版本号
这是最可靠的方式,无需字符串解析,自动适配所有JDK内部版本表示逻辑,包括预览版、EA版等特殊标记。仅需确保运行环境为 Java 9 或更高版本。


















