适用于Apple M1芯片的Java / JDK?

问题描述

是否需要特殊版本的OpenJDK以支持新的Apple M1芯片?

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

解决方法

是的

在此页面上:AdoptOpenJDK Latest Releases,您可以从“操作系统”下拉菜单中选择“ macOS”,然后从“体系结构”中选择,目前它仅为x64,但很快应该会有AArch64或ARM64(通常是64位ARM的简码)。毫无疑问,由于苹果无疑在其M1设计中内置了许多扩展,因此苹果拥有了自己的产品。

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

所以:它还不存在,但是请注意,ARM的JDK已有十多年的历史了,尽管JDK15放弃了对许多奇特的OS / arch组合(例如solaris)的支持,但ARM开发人员至少一直保持至少部分相关(即使到目前为止,它主要是Oracle商业许可证产品)。就是说:创建一个本地运行在M1上的acceptopenopenjdk发布不是费力的工作,因此大概会发生。但是,这是开放源代码的工作,因此,如果您急于想必,请仔细阅读并做出贡献:)

直到2020年11月10日,苹果公司都没有提供有关此体系结构的任何细节,除非您为此购买了devkit盒(一个装有A14芯片的苹果mini,它不是M1芯片,但我猜它足够接近),并签署了一个大型的保密协议。

通常,如果您绕开NDA,开源项目将以相反的方向尽可能快地运行,因此,如果您不喜欢这种情况,我认为抱怨采用openjdk或其他打包程序并不明智。和有关它的开源项目:)

幸运的是,现在已经淘汰了,不再需要NDA。我的假设是,一旦熟悉openjdk源代码的人使用基于M1的macos系统对其进行测试,就可以相当轻松地组合OpenJDK源代码的ARM分支+ macos-x64版本已经存在的macos位。这应该意味着一个月内应该在这里发布一个optaopenopenjdk macos-aarch64版本。

但是,开源。您没有付钱给他们,您没有合同,他们也不欠您。如果您希望速度更快,则可以做出贡献或捐赠请求。

更新:

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

Azul在其网站的“下载”部分中提供了OpenJDK的MacOS ARM版本。我还没有尝试过它们,但是Azul是JDK的长期开发人员。

更新:解开Azul JDK的包装后,您必须在其中进行四处逛逛,直到找到System.out.println(data.getClass().getSimpleName()); // "String","Integer",etc. 目录(假设您已下载jdk11),然后将其复制到zulu-11.jdk

,

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

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

# Install OpenJDK
brew install openjdk

验证是否已安装:

$(brew --prefix openjdk)/bin/java --version

验证它是否适用于 arm64 硬件:

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

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

注意:在撰写本文时,Homebrew 会声称它正在安装 OpenJDK15,但实际上会安装 OpenJDK16。这是由于 Homebrew 中的 stable 打包规则造成的,一旦 Intel 包也被撞到 OpenJDK16,就会被排序。

,

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

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

,

请到 Azul 网站下载 dmg

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

这将被放置在库中,一旦 IntelliJ 识别它,就可以运行了

,

不仅仅是JEP-391。 有一个预览分支-https://github.com/openjdk/jdk-sandbox/tree/JEP-391-branch

一个人可以在Intel Mac或直接在Arm Mac上使用交叉编译来构建16-ea 而且运行正常

,

Microsoft / Azul似乎是jep-391与Windows端口(jep-388)结合的主要推动力。他们有一个单独的github repository,实际上具有适用于macOS-aarch64的EA版本。

不确定与openjdk回购有什么确切关系。

,

您可以下载Liberica JDK

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

在 M1 的 IDEA 中,JetBrains Runtime 也是原生的 (ARM64)。

,

以下是安装 Oracle JDK 8 并从 rosetta 运行它的步骤 https://www.oracle.com/in/java/technologies/javase/javase-jdk8-downloads.html

  • 下载 macOSx64 版本
  • 尝试安装软件包时,如果 Rosetta 不存在,您将收到安装提示
  • 其余的安装步骤与任何其他软件包一样。

您可以通过打开终端并输入来验证它是否有效 java -version

,

只是想说,虽然 azul jdk 原生在 m1 上运行并且速度很好,但仍然存在问题。尤其是一些java代码需要调用C++代码的时候。

例如,我是一名大数据开发人员。我开始在我的开发工作流程中使用 azul jdk。但我注意到某些测试在切换后开始失败。比如测试写入parquet/avro文件时失败,我想是因为parquet/avro有一些C++原生的东西,没有编译m1。

出于这个特定原因,我被迫使用非 m1 jdk,这很慢。那里没有问题。

以下是我在 azul 中遇到的错误示例,而在非 m1 jdk 中则没有:

- convert base 64 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)

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

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

小心!

,

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

vim .sdkman/etc/config

编辑集sdkman_rosetta2_compatbile=false

之后您将看到与 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
================================================================================

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

sdk install java 8.0.292-zulu

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...