1. 概述
在开发中,识别当前运行的操作系统(OS)是一项常见需求,尤其当你需要实现 平台差异化逻辑 时——比如路径处理、命令调用或依赖库加载。踩过坑的同学都知道,Windows 和 *nix 系统之间的差异足以让一个看似正常的程序直接崩溃。
本文将介绍在 Kotlin 中检测操作系统的几种实用方法,帮助你在 JVM 环境下准确识别运行环境。
2. 使用 System.getProperty()
方法
Kotlin 运行在 JVM 上,天然继承了 Java 的 [System](/java-lang-system)
类,这是我们获取系统信息的入口。其中,[System.getProperty()](/java-system-get-property-vs-system-getenv#using-systemgetproperty)
方法可以读取与操作系统相关的系统属性。
关键属性有两个:
- ✅
os.name
:操作系统名称 - ✅
os.version
:操作系统版本
我们可以通过以下代码获取基本信息:
val osName = System.getProperty("os.name")
val osVersion = System.getProperty("os.version")
assertTrue { osName.isNotBlank() }
assertTrue { osVersion.isNotBlank() }
log.info(
"""|
|OS Information
|-----------------
|OS_Name: $osName
|Version: $osVersion
|""".trimMargin())
实际测试结果
在 Arch Linux 上执行:
先通过 uname
查看内核信息:
$ uname -sr
Linux 6.1.35-1-lts
运行上述 Kotlin 代码后输出:
OS Information
-----------------
OS_Name: Linux
Version: 6.1.35-1-lts
在 macOS 设备上执行:
查看系统版本:
$ sw_vers
ProductName: macOS
ProductVersion: 14.2.1
...
Kotlin 输出为:
OS_Name: Mac OS X
Version: 14.2.1
✅ 可见 System.getProperty()
能正确返回 OS 信息。
常见判断模式
实际开发中,我们通常不会只打印信息,而是根据 os.name
的关键词做条件判断。例如使用 Kotlin 的 when
表达式:
val osName = System.getProperty("os.name").lowercase()
assertTrue { osName.isNotBlank() }
val result = when {
"windows" in osName -> "Windows"
listOf("mac", "nix", "sunos", "solaris", "bsd").any { it in osName } -> "*nix"
else -> "Other"
}
log.info(">>> $osName -> $result")
在 Linux 上输出:
>>> linux -> *nix
在 MacBook 上输出:
>>> mac os x -> *nix
⚠️ 但这种方式存在明显问题:
- ❌ 需手动维护 *nix 系统列表,易遗漏(如 AIX、HP-UX、IRIX)
- ❌ 判断版本需多次字符串匹配,容易出错且难以维护
- ❌ 对未来新系统缺乏扩展性
因此,推荐使用成熟工具类库来避免这些“低级”错误。
3. 使用 Apache Commons Lang 3 的 SystemUtils
Apache Commons Lang 3 是 Java/Kotlin 社区广泛使用的工具库,其 [SystemUtils](/java-commons-lang-3#the-systemutils-class)
类封装了常见的系统信息判断逻辑。
底层仍是读取 os.name
和 os.version
,但提供了更安全、更全面的静态常量。
示例代码
val osName = SystemUtils.OS_NAME
val osVersion = SystemUtils.OS_VERSION
assertTrue { osName.isNotBlank() }
assertTrue { osVersion.isNotBlank() }
log.info(
"""|
|OS Information
|-----------------
|OS_Name : $osName
|Version : $osVersion
|Is Windows: ${SystemUtils.IS_OS_WINDOWS}
|Is *nix : ${SystemUtils.IS_OS_UNIX}
|Is Mac OS : ${SystemUtils.IS_OS_MAC}
|""".trimMargin())
特性说明
SystemUtils
提供了一系列预定义的布尔常量,开箱即用:
判断项 | 对应常量 |
---|---|
是否为 Windows | IS_OS_WINDOWS |
是否为 *nix 系统(含 Linux、macOS、BSD 等) | IS_OS_UNIX |
是否为 macOS | IS_OS_MAC |
是否为特定 Windows 版本 | IS_OS_WINDOWS_10 , IS_OS_WINDOWS_VISTA , IS_OS_WINDOWS_2000 等 |
实测输出
Linux 环境:
OS Information
-----------------
OS_Name : Linux
Version : 6.1.35-1-lts
Is Windows: false
Is *nix : true
Is Mac OS : false
macOS 环境:
OS Information
-----------------
OS_Name : Mac OS X
Version : 14.2.1
Is Windows: false
Is *nix : true
Is Mac OS : true
✅ 所有判断均准确无误,且无需手动维护关键词列表。
4. 总结
本文介绍了两种在 Kotlin 中获取操作系统信息的方法:
- ✅ **
System.getProperty("os.name")
**:原生方式,简单直接,适合轻量场景 - ✅
SystemUtils
(Apache Commons Lang 3):推荐方案,功能完整,避免魔数和遗漏,适合生产环境
📌 建议:除非项目极度精简不能引入第三方依赖,否则优先使用
SystemUtils
。它能帮你避开很多“我以为没问题”的坑。
所有示例代码已托管至 GitHub:https://github.com/Baeldung/kotlin-tutorials/tree/master/core-kotlin-modules/core-kotlin-10