java - Java SDK 在 Mac M1 上报告错误的架构
问题描述
我有一个奇怪的java问题。我正在开发 MacBook Air 并做一些 Java 开发工作。我需要我的代码来执行以下操作:
// pseudo code
if (intel) {
// Load docker
} else if (arm) {
// Load ARM docker
}
它适用于 Intel 和基于 Linux 的 ARM 架构。但对于我的 M1 MacBook Air,它报告操作系统是Mac OS X
,但架构报告为x86
. 由于最后一个问题,我无法区分 ARM 和 Intel 机器。
这是我正在运行的 JDK 版本。我觉得我在这里遗漏了一些东西,但是有什么方法可以编写此代码,以便我可以确定代码是在 M1 还是 Intel 上运行?
~ java --version
openjdk 11.0.12 2021-07-20 LTS
OpenJDK Runtime Environment Zulu11.50+19-CA (build 11.0.12+7-LTS)
OpenJDK 64-Bit Server VM Zulu11.50+19-CA (build 11.0.12+7-LTS, mixed mode)
(base) ➜ ~ java -XshowSettings 2>&1 | grep " os."
os.arch = x86_64
os.name = Mac OS X
os.version = 11.5
解决方案
这可能是因为您实际上是在 M1 Macbook 上通过 Rosetta 运行 x86_64 Java VM。至少 AdoptOpenJDK 甚至不提供 Java 11 的原生 m1 版本。对于 Java 17,有可用的原生 aarch64 版本:https ://adoptium.net/releases.html?variant=openjdk17&jvmVariant=hotspot
在与地图捆绑的活动监视器应用程序中,您可以验证应用程序(“进程”)是否在本机运行与在Rosetta 2下运行。找到您的进程,可能命名为java
,然后查看Kind列。原生应用说Apple
,而 Rosetta 2 下的应用说Intel
.
推荐阅读
- xamarin.forms - 为什么样式不会在 Xamarin UWP 上的 DataTemplate 内动态更新
- azure - 两个应用程序之间的 Azure 用户模拟设置
- r - 使用多个分组变量获取组平均值并排除自己的组值
- assembly - 使用 MASM 时,“r”后缀如何对应浮点数?
- php - 无法在 PHP 中将斜杠写入文件
- httpwatch - HttpWatch:Result ERROR 0x8 是什么意思?
- vba - VBA 电子邮件 HTML 正文添加页面分隔符
- node.js - 触发 1k 个 HTTP 请求的并行会卡住
- angular - 尝试使用 attach 方法在 VSCode 中调试 Angular 时我做错了什么?
- python - 无法使用 pipenv 安装 PyPi 库