跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

怎么利用 System.getProperty 获取 Java 运行时环境及版本信息

System.getProperty返回null的主因是属性名不存在或拼写错误;标准属性如"java.version"大小写敏感,且需确认JVM是否完整初始化,容器或精简环境可能导致部分属性缺失。 System.getProperty 返回 null 的常见原因 调用
System.getProperty("java.version")
或类似键却得到
null
,大概率不是代码写错了,而是传入了不存在的属性名。Java 标准属性名是固定拼写的,大小写敏感,比如
"java.version"
有效,但
"Java.Version"
或
"java_version"
都会返回
null
。 更隐蔽的情况是:某些 JVM 启动参数(如
-Djava.version=xxx
)手动覆盖了系统属性,或在容器/嵌入式环境中部分属性未被初始化(如精简版 JRE、GraalVM native image)。这时建议先用
System.getProperties().list(System.out)
粗略查看当前所有可用键值对。 必须掌握的 5 个核心属性名 获取运行时环境和版本,不需要查文档翻半天,记住这五个最常用、最稳定的键:
"java.version"
:JDK 主版本号,如
"17.0.1"
(注意不是
"17"
)
"java.runtime.version"
:含构建信息的完整运行时版本,如
"17.0.1+12-LTS"
"java.vendor"
:厂商名,如
"Eclipse Adoptium"
或
"Amazon"
"os.name"
和
"os.version"
:操作系统名称与内核版本,例如
"Linux"
+
"5.15.0-107-generic"
它们在所有标准 JVM 上都保证存在,且不会因用户自定义
-D
参数而被意外覆盖(除非显式覆写)。 立即学习 “ Java免费学习笔记(深入) ”; 区分 java .version 和 java.specification.version
java.version
是实现版本,反映你实际运行的 JDK;而
java.specification.version
是 Java SE 规范版本号,比如 JDK 17 实现的是 Java SE 17 规范,所以它返回
"17"
(纯数字字符串)。两者数值常一致,但语义不同: Eclipse导入Android或其他的JAVA项目的正确方法 WORD版 本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看 下载 做兼容性判断(如“是否 ≥ Java 11”)应优先用
java.specification.version
,因为它是规范层面的承诺 排查环境问题(如确认是否用了 Temurin 而非 Zulu)则看
java.version
+
java.vendor
Double.parseDouble(System.getProperty("java.specification.version"))
可安全转为数值比较,但
java.version
含
"+"
和字母,不能直接 parse 在容器或 CI 中读取失败怎么办 Docker 容器里
System.getProperty("os.arch")
可能返回
"amd64"
而非
"x86_64"
,这不是 bug,是 JVM 对底层架构的标准化映射;更关键的是,某些 CI 环境(如 GitHub Actions 的 ubuntu-latest)默认用 JRE 而非 JDK,导致
"java.home"
指向 JRE 目录,
"sun.boot.class.path"
等内部属性可能缺失——但这不影响前述五个核心属性。 如果仍需验证 JDK 完整性,可组合使用:
String home = System.getProperty("java.home"); String version = System.getProperty("java.version"); if (home != null && version != null) { // 基本可认定是可用的 JDK/JRE 环境 }
别依赖
"sun.*"
开头的属性,它们是非标准、随时可能移除的内部实现细节。 真正容易被忽略的点是:属性值本身不带校验逻辑,
System.getProperty
不抛异常也不警告,出错就静默返回
null
。所以每次取值后务必判空,尤其在自动化脚本或启动检查逻辑中。

相关文章