苹果 M1 芯片的 Java/JDK?

Tha*_*har 109 java macos apple-m1

是否需要特别发布 OpenJDK 来支持新的 Apple M1 芯片?

我看到目前有适用于 macOS/OS X 的 JDK 下载,但这些似乎只适用于 x86 处理器。那是对的吗?如果是这样,我在哪里可以下载 M1 的 OpenJDK 版本?

rzw*_*oot 72

是的。

在此页面上:AdoptOpenJDK 最新版本,您可以从“操作系统”下拉列表中选择“macOS”,然后从“架构”中选择,目前只有 x64,但很快就会有 AArch64 或 ARM64(这些通常是 64-位 ARM)。可能是因为苹果无疑在其 M1 设计中内置了大量扩展,因此苹果有自己的扩展。

如果您将操作系统保留在“任何”上,您会注意到 aarch64 在那里,这使您可以使用 ARM 处理器的 linux 版本。这(可能)不会在 M1 硬件上的 MacOS 上运行,但已经完成了 95% 的工作。

所以:它还没有,但请注意 ARM 的 JDK 已经可用了十年以上,虽然 JDK15 已经放弃了对一堆奇特的 OS/arch 组合(例如 solaris)的支持,但 ARM 开发人员始终至少保持部分相关性(即使到目前为止它主要是一个 oracle 商业许可证产品)。也就是说:创建一个原生运行在M1s上的adoptopenjdk版本不应该是一项艰巨的努力,所以想必,它会发生。但是,这是开源的努力,所以如果您感到焦虑,请务必阅读并做出贡献:)

直到 2020 年 11 月 10 日,Apple 才提供有关此架构的任何详细信息,除非您为它购买了一个 devkit 盒(带有 A14 芯片的 Apple mini,它不是 M1 芯片,但我猜它足够接近),并签署了一份大保密协议。

一般来说,如果你挥舞 NDA,开源项目会尽可能快地朝着相反的方向运行,所以如果你不喜欢这种状态,我认为抱怨采用 openjdk 或其他打包器和开源是不明智的关于它的项目:)

幸运的是,现在已经结束了,不再需要 NDA。我的假设是,一旦熟悉 openjdk 源代码的人有一个基于 M1 的 macos 系统来测试它,OpenJDK 源代码的 ARM 分支 + macos-x64 版本已经存在的 macos 位可以很容易地组合起来,这应该意味着应该在本月内发布一个采用 openjdk macos-aarch64 的版本。

但是,开源。你没有付钱给他们,你没有合同,他们也不欠你的。如果您希望它运行得更快,请捐款或贡献拉取请求。

更新:

  • Azul 的 M1 OpenJDK 构建
  • Microsoft 的(是的,真的)github 源代码库,用于在 AArch64 上为 MacOS 构建早期访问 OpenJDK16。请注意,微软已经在 AArch64(针对基于 ARM 的 Windows 10)的 openjdk 分支上工作了一段时间,这可以追溯到:许多艰苦的工作已经完成。

  • 这篇文章说“很快”,但已经过去 9 个月了,采用链接并不比最初发布时更有帮助。“aarch64”的解释很有帮助,因为对于大多数 M1 用户来说,这些术语是同义词并不明显,但是第一个链接仍然没有帮助,应该被编辑掉,直到 Adoptium 团队可以生成 M1 工件。 (3认同)
  • 请注意,OpenJDK 项目已移至 Eclipse Fondation,现在新网站为:[https://adoptium.net](https://adoptium.net) (3认同)
  • “很快”终于来了。Adoptium 项目最近发布了针对 Java 17 的第一个 M1 版本。https://adoptium.net/releases.html?variant=openjdk17&jvmVariant=hotspot。 (3认同)
  • 运行 gradle 在 Microsoft 的预览版上不起作用。在这里报告 https://github.com/openjdk/aarch64-port/issues/8 (2认同)

Pha*_*inh 47

brew install openjdk
Run Code Online (Sandbox Code Playgroud)

就我而言,在MacBook Air (M1)上成功安装OpenJDK后,该命令仍然不起作用。我通过修复它java

brew info openjdk
Run Code Online (Sandbox Code Playgroud)

然后有一个像这样的命令

brew install openjdk
Run Code Online (Sandbox Code Playgroud)

执行这个命令,java命令就起作用了。


Min*_* Iu 32

Azul在其网站的“下载”部分提供了 MacOS ARM 版本的 OpenJDK。虽然我还没有尝试过,但 Azul 一直是 JDK 的长期开发者。

更新:解压 Azul JDK 后,您必须在其中翻找,直到找到zulu-11.jdk目录(假设您已下载 jdk11),然后将其复制到/Library/Java/JavaVirtualMachines

  • 我下载了他们的 .dmg,它就可以工作了——不需要复制 (3认同)

Bor*_*nov 26

您可以使用 sdkman 安装 Java JDK(请参阅sdkman install):

vim .sdkman/etc/config
Run Code Online (Sandbox Code Playgroud)

设置sdkman_rosetta2_compatible=false(参见sdkman 配置

之后,您将看到与 M1 JDK 兼容的列表:

sdk list java

================================================================================
Available Java Versions
================================================================================
 Vendor        | Use | Version      | Dist    | Status     | Identifier
--------------------------------------------------------------------------------
 Azul Zulu     |     | 16.0.1       | zulu    |            | 16.0.1-zulu
               |     | 11.0.11      | zulu    |            | 11.0.11-zulu
               |     | 8.0.292      | zulu    |            | 8.0.292-zulu
 BellSoft      |     | 16.0.1       | librca  |            | 16.0.1-librca
               |     | 11.0.11      | librca  |            | 11.0.11-librca
               |     | 8.0.292      | librca  |            | 8.0.292-librca
 Java.net      |     | 18.ea.3      | open    |            | 18.ea.3-open
               |     | 18.ea.2      | open    |            | 18.ea.2-open
               |     | 18.ea.1      | open    |            | 18.ea.1-open
               |     | 17.ea.28     | open    |            | 17.ea.28-open
               |     | 17.ea.27     | open    |            | 17.ea.27-open
               |     | 17.ea.26     | open    |            | 17.ea.26-open
               |     | 17.ea.25     | open    |            | 17.ea.25-open
================================================================================
Run Code Online (Sandbox Code Playgroud)

选择一个并使用命令安装它sdk install java IDENTIFIER,即:

sdk install java 8.0.292-zulu

  • 不要忘记更新 JAVA_HOME,例如 `export JAVA_HOME=/Users/<username>/.sdkman/candidates/java/current` (2认同)

ham*_*uki 21

现在,Oracle 的 OpenJDK 17 支持 Apple M1 芯片。JEP 391的状态为已关闭\xe2\x80\x89&\xe2\x80\x89已交付。

\n

您可以从官方网站下载 JDK 版本 17 的免费 macOS/AArch64 开源版本。

\n


小智 12

我正在使用 Azul OpenJDK 和 Netbeans 在新的 Apple M1 芯片上成功开发 Java 应用程序。

配置:zulu16.0.65-ea-jdk16.0.0-ea.24-macos_aarch64 Netbeans 12.1 和 maven。


tre*_*esf 11

命令行方法(感谢 Homebrew 团队以及分支@vladimir-kempik上其他 openjdk 贡献者的辛勤工作JEP-391

# Install Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Install OpenJDK
brew install openjdk
Run Code Online (Sandbox Code Playgroud)

验证是否已安装:

$(brew --prefix openjdk)/bin/java --version
Run Code Online (Sandbox Code Playgroud)

验证它适用于 arm64 硬件:

file $(brew --prefix openjdk)/bin/java     
# /opt/homebrew/opt/openjdk/bin/java: Mach-O 64-bit executable arm64
Run Code Online (Sandbox Code Playgroud)

注意:要在系统范围内安装 openjdk,请按照 Homebrew 提供的屏幕说明进行操作。

注意:在撰写本文时,Homebrew 可能声称它在 M1 上安装了不同版本的 OpenJDK。这是由于stableHomebrew 中的打包规则,将随着时间的推移进行排序。

  • 这也适用于 java 11,没有任何问题 `brew install openjdk@11` 和 `file $(brew --prefix openjdk@11)/bin/java` - Apple MacBook Pro 2021 - M1 Pro (10 Cores) - 使用自制程序是对我来说,这是优于其他方法的选择 (19认同)
  • @JustinFuruness如果`JAVA_HOME`是硬性要求,您可以执行`export JAVA_HOME="$(brew --prefix openjdk)/libexec/openjdk.jdk/Contents/Home"`,尽管`brew info openjdk`包含配置说明系统找到它,引用:“为了让系统 Java 包装器找到这个 JDK,请将其符号链接为...”(确切的命令特定于您的系统,由 Homebrew 打印)。 (16认同)
  • OpenJDK 17是第一个正式支持M1架构的java版本 (4认同)

hey*_*you 7

我尝试过 Azul JDK 8。

我只是想说,虽然 Azul JDK 在 Apple M1 上原生运行并且速度很快,但仍然存在问题。特别是当一些Java代码需要调用C++代码时。

例如,我是一名大数据开发人员。我开始在我的开发工作流程中使用 Azul JDK。但我注意到某些测试在切换后开始失败。例如,当测试写入Parquet / Avro文件时,它会失败。我认为这是因为有一些用 C++ 为 Parquet/Avro 编写的本机内容,并且它们不是为 M1 编译的。

由于这个具体原因,我被迫使用非 M1 JDK,它很慢。那里没有问题。

以下是我在 Azul 中遇到的错误示例,但在非 M1 JDK 中却没有遇到这种情况:

- convert Base64 JSON back to rpo Avro *** FAILED ***
  org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 10.0 failed 1 times, most recent failure: Lost task 0.0 in stage 10.0 (TID 14, localhost, executor driver): org.xerial.snappy.SnappyError: [FAILED_TO_LOAD_NATIVE_LIBRARY] no native library is found for os.name=Mac and os.arch=aarch64
        at org.xerial.snappy.SnappyLoader.findNativeLibrary(SnappyLoader.java:331)
        at org.xerial.snappy.SnappyLoader.loadNativeLibrary(SnappyLoader.java:171)
        at org.xerial.snappy.SnappyLoader.load(SnappyLoader.java:152)
        at org.xerial.snappy.Snappy.<clinit>(Snappy.java:47)
        at org.apache.avro.file.SnappyCodec.compress(SnappyCodec.java:43)
        at org.apache.avro.file.DataFileStream$DataBlock.compressUsing(DataFileStream.java:358)
        at org.apache.avro.file.DataFileWriter.writeBlock(DataFileWriter.java:382)
        at org.apache.avro.file.DataFileWriter.sync(DataFileWriter.java:401)
        at org.apache.avro.file.DataFileWriter.flush(DataFileWriter.java:410)
        at org.apache.avro.file.DataFileWriter.close(DataFileWriter.java:433)
        at org.apache.avro.mapred.AvroOutputFormat$1.close(AvroOutputFormat.java:170)
        at org.apache.spark.internal.io.SparkHadoopWriter.close(SparkHadoopWriter.scala:101)
        at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$1$$anonfun$12$$anonfun$apply$5.apply$mcV$sp(PairRDDFunctions.scala:1145)
        at org.apache.spark.util.Utils$.tryWithSafeFinallyAndFailureCallbacks(Utils.scala:1393)
        at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$1$$anonfun$12.apply(PairRDDFunctions.scala:1145)
        at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$1$$anonfun$12.apply(PairRDDFunctions.scala:1125)
        at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
        at org.apache.spark.scheduler.Task.run(Task.scala:108)
        at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:335)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

Driver stacktrace:
  at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1499)
  at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1487)
  at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1486)
  at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
  at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
  at org.apache.spark.scheduler.DAGScheduler.abortStage(DAGScheduler.scala:1486)
  at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:814)
  at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:814)
  at scala.Option.foreach(Option.scala:257)
  at org.apache.spark.scheduler.DAGScheduler.handleTaskSetFailed(DAGScheduler.scala:814)
  ...
  Cause: org.xerial.snappy.SnappyError: [FAILED_TO_LOAD_NATIVE_LIBRARY] no native library is found for os.name=Mac and os.arch=aarch64
  at org.xerial.snappy.SnappyLoader.findNativeLibrary(SnappyLoader.java:331)
  at org.xerial.snappy.SnappyLoader.loadNativeLibrary(SnappyLoader.java:171)
  at org.xerial.snappy.SnappyLoader.load(SnappyLoader.java:152)
  at org.xerial.snappy.Snappy.<clinit>(Snappy.java:47)
  at org.apache.avro.file.SnappyCodec.compress(SnappyCodec.java:43)
  at org.apache.avro.file.DataFileStream$DataBlock.compressUsing(DataFileStream.java:358)
  at org.apache.avro.file.DataFileWriter.writeBlock(DataFileWriter.java:382)
  at org.apache.avro.file.DataFileWriter.sync(DataFileWriter.java:401)
  at org.apache.avro.file.DataFileWriter.flush(DataFileWriter.java:410)
  at org.apache.avro.file.DataFileWriter.close(DataFileWriter.java:433)
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它说: Cause: org.xerial.snappy.SnappyError: [FAILED_TO_LOAD_NATIVE_LIBRARY] no native library is found for os.name=Mac and os.arch=aarch64

我用谷歌搜索了这个问题,他们说本机库是为Spark的更高版本编译的,不幸的是。

这让我非常沮丧,我现在想要一台 Windows 笔记本电脑,哈哈。在 M1 芯片上运行 Intel JDK 有时会很慢,我不希望这样。

当心!

更新: 他们发布了支持 M1 的新版本库,我在项目中更新了它们,一切正常,感谢上帝。有时,这些“本机代码错误”会以不同的异常表现出来,这是我必须处理的额外 PITA,而使用 Windows 笔记本电脑的同事则不需要处理它。有时错误可能有点不清楚,但如果您在错误日志中看到有关本机代码的内容,或者诸如“jna”或“jni”之类的单词,那么这是 M1 芯片的问题。

  • 是的,这绝对是依赖开源库来帮助提交错误报告并跟踪有效内容的社区的义务。这就是开源的工作原理。用户或开发人员发现问题所在,参与其中,让合适的人知道并提供帮助。针对您的错误的具体情况,提供了修复链接。记录这个过程会让其他人受益。更新此依赖项可能并不明显,并且在项目之间会有所不同,但为其他人记录这一点将有助于推动社区向前发展。开源是众包的努力。:/ (2认同)

小智 7

我按照以下步骤操作,能够在MacBook Air (M1)上成功运行 JDK 16 :

\n
    \n
  1. 转到“Oracle.com”
  2. \n
  3. 转至产品\xe2\x86\x92软件\xe2\x86\x92 Java
  4. \n
  5. 单击“立即下载 Java”
  6. \n
  7. 点击“JDK下载”
  8. \n
  9. 选择“macOS 安装程序”
  10. \n
  11. 安装JDK
  12. \n
  13. 尝试使用任何示例 Java 程序,这应该适合您。
  14. \n
\n

我能够在我的 MacBook Air (M1) 上安装并成功运行它。

\n


小智 6

您可以从以下位置下载 Liberica JDK:

https://bell-sw.com/pages/downloads/?os=macOS&architecture=ARM

IntelliJ IDEA for M1 中,JetBrains 运行时也是本机的 (ARM64)。


小智 5

请前往 Azul 网站并下载 dmg

https://www.azul.com/downloads/zulu-community/?os=macos&architecture=arm-64-bit&package=jdk

这将被放置在库中,一旦 IntelliJ 识别它,它应该很好运行