java - 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 文档没有指定任何细节。
解决方案
可以确认在采用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 字符串,我可以将其分解为一些模糊的功能批次,但是如果我需要操作系统的实际名称来展示给用户呢?
那么你有三个主要的选择:
最简单的方法是编写映射代码。承认这一点
os.name
并os.version
给你(相当有争议的)有用的意图,而不是太多的官方名称,因此,写一些映射。这些会将名称/版本对映射到呈现字符串,回退到仅打印名称字符串和版本字符串,逐字连接。您可以在此表中添加映射:Mac OS X/10.16
→ 。Mac OS Big Sur
困难的方法:找出你在 Mac 上(现在更容易;
os.name
返回Mac OS X
,或者只是检查是否存在:)Files.isExecutable(Paths.get("/usr/bin/sw_vers"))
,然后使用ProcessBuilder
to 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
。
- 如果您需要此信息来扫描操作系统功能,请停止执行此操作。它不适用于浏览器,也不是操作系统发布的好计划。您正在扫描什么功能?想象一下,例如,如果它是“我可以运行 /usr/bin/sw_vers 来解决问题吗”,作为一个假设的例子。正确的策略是不检查 os.name/os.version,得出该命令必须存在的结论,然后运行它,如果不存在则灾难性地失败。正确的做法是检查 /usr/bin/sw_vers 是否存在,然后执行它,在其他情况下退回到一些非基于 mac 的解决方案(可能是 /usr/bin/uname)。扫描能力,不要扫描操作系统/版本。
推荐阅读
- javascript - 在初始化之前阻止调用的好习惯?
- javascript - 劫持表单提交,存储原始提交,添加处理,然后正常提交
- php - 在 foreach 循环中添加 datedif 的结果
- android - 更新了 MoPub,现在我在构建签名的 apk 时得到 ExoPlayer 的“找不到引用的字段”
- javascript - 如何使用 svg 或画布上的 javascript 使用实时 x 和 y 数据绘制 2D 形状
- ms-access - System.Object 和 System.EventArgs
- logical-operators - 大于“>”的 Lambda 微积分函数
- php - 从 MySQL 检索数据到 React Native 时获取缓慢
- java - 为什么我的嵌套循环在循环末尾打印了一个额外的空间?
- git - 使用终端检索特定时间范围内的提交