【问题标题】:Java SDK Reporting Wrong Architecture on Mac M1Java SDK 在 Mac M1 上报告错误的架构
【发布时间】:2021-11-28 11:37:30
【问题描述】:

我有一个奇怪的 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

【问题讨论】:

    标签: java macos java-8 java-11


    【解决方案1】:

    这可能是因为您实际上是在 M1 Macbook 上通过 Rosetta 运行 x86_64 Java VM。至少 AdoptOpenJDK 甚至不提供 Java 11 的原生 m1 版本。对于 Java 17,有可用的原生 aarch64 版本:https://adoptium.net/releases.html?variant=openjdk17&jvmVariant=hotspot

    在与您的地图捆绑的Activity Monitor 应用程序中,您可以验证应用程序(“进程”)是否在本机运行而不是在Rosetta 2 下运行。找到您的进程,可能命名为 java,然后查看 Kind 列。原生应用说Apple,而Rosetta 2 下的应用说Intel

    【讨论】:

    • 是的。我想你是正确的。我在我的 M1 上运行 Zulu(他们确实提供了 Java 11 的 aarch 版本),与 OP 相同,并且我得到了 os.arch 的“aarch64”。我猜他们安装了非本地版本
    • 为了像我这样的 n00b 的利益,有没有办法确保我安装的是 JDK 的 ARM 版本?我正在使用 sdkman,我认为我正在这样做。
    • @cgivre 我不使用sdkman。我从Adoptium 或 Azul Systems(还有 Pivotal、Red Hat/IBM、BellSoft、Microsoft、Amazon、Oracle、SAP 等)等供应商处下载安装程序。在他们的下载页面上时,请注意他们的标签。 “macOS x64”或“x86-64”等标签表示 Intel 机器。如果需要,请查找某些部分或指向“其他平台”的链接。为您的 Apple Silicon M1 chip 优化的 JDK 查找“macOS aarch64”或“macOS ARM”。
    • 除了@BasilBourque 的回答,我还可以推荐使用brew.sh 并使用“brew install java”安装它,并保持更新。它应该会自动安装本机版本。
    猜你喜欢
    • 2022-08-24
    • 2021-10-04
    • 2021-12-10
    • 2022-10-03
    • 2022-08-24
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多