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.nameos.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


原始标题:Determine Operating System in Kotlin