首页 > 解决方案 > Big Sur 上的 Java 8 将 os.name 报告为“Mac OS X”,将 os.version 报告为“10.16”

问题描述

这只是我的设置还是其他人有这个问题?

使用安装在以下位置的 AdoptOpenJDK 1.8.0_275:

/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/jre

System.getProperties()的 API 文档没有指定任何细节。

标签: javamacos-big-sur

解决方案


可以确认在采用openjdk14 以及j16 的openjdk 早期访问版本上仍然会发生这种情况。

如果你愿意,你可以提交一个错误,但我敢打赌它会被拒绝。在这一点上,这个名称Mac OS X与其说是“操作系统的名称”,不如说是“全球公认的识别基于 unix 的 mac 操作系统的关键字”,我的意思是全局字面意思(如“环绕地球”,而不是'跨越你的源基地/虚拟机')。改变它只会不必要地破坏东西。这同样适用于版本 10.16,但程度较低:点之前的内容与其说是“这就是操作系统标识自己的方式”,不如说是“全球公认的 Mac OS 版本控制方案,确定了一个广泛且定义不明确的方案”能力集”。

big sur 和 catalina 之间的过渡并没有什么有意义的区别,只是苹果做出了营销决策。如果您想指出一个操作系统转换可能需要完全模糊地选择将其视为“重大变化”,那么它肯定是 catalina 的一个因为它做出了迄今为止最大的变化(包括完全取消对 32 位的支持) 在最后一批版本中。

这给您带来了以下挑战:好的,太好了,我可以使用System.getProperty("os.name")获得全球认可的关键字,这意味着类 unix 的 Mac OS,以及 os.version 字符串,我可以将其分解为一些模糊的功能批次,但是如果我需要操作系统的实际名称来展示给用户呢?

那么你有三个主要的选择:

  1. 最简单的方法是编写映射代码。承认这一点os.nameos.version给你(相当有争议的)有用的意图,而不是太多的官方名称,因此,写一些映射。这些会将名称/版本对映射到呈现字符串,回退到仅打印名称字符串和版本字符串,逐字连接。您可以在此表中添加映射:Mac OS X/10.16→ 。Mac OS Big Sur

  2. 困难的方法:找出你在 Mac 上(现在更容易;os.name返回Mac OS X,或者只是检查是否存在:)Files.isExecutable(Paths.get("/usr/bin/sw_vers")),然后使用ProcessBuilderto execute /usr/bin/sw_vers,将所有输出提取到一个大字符串中,然后解析它。它的输出看起来像:

ProductName:    macOS
ProductVersion: 11.1
BuildVersion:   20C69

其中,至关重要的是,它甚至不包括单词Big Sur,但确实给了你11.1。我不知道如何运行一个实际上为您提供Big Sur. 也许system_profiler,但请注意,这需要很多分钟才能运行,我真的怀疑你想要运行它。

注意:你也可以运行.command("/usr/bin/sw_vers", "-productVersion")which 给你 just 11.1,这可能更容易解析。-productName也有效,给你只是macOS

  1. 如果您需要此信息来扫描操作系统功能,请停止执行此操作。它不适用于浏览器,也不是操作系统发布的好计划。您正在扫描什么功能?想象一下,例如,如果它是“我可以运行 /usr/bin/sw_vers 来解决问题吗”,作为一个假设的例子。正确的策略是检查 os.name/os.version,得出该命令必须存在的结论,然后运行它,如果不存在则灾难性地失败。正确的做法是检查 /usr/bin/sw_vers 是否存在,然后执行它,在其他情况下退回到一些非基于 mac 的解决方案(可能是 /usr/bin/uname)。扫描能力,不要扫描操作系统/版本。

推荐阅读