是否需要特殊版本的OpenJDK以支持新的Apple M1芯片?
我看到当前有用于macOS / OS X的JDK下载,但这些下载似乎仅适用于x86处理器。那是对的吗?如果是这样,我在哪里可以下载M1的OpenJDK版本?
答案 0 :(得分:29)
是的
在此页面上: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版本。
但是,开源。您没有付钱给他们,您没有合同,他们也不欠您。如果您希望速度更快,则可以做出贡献或捐赠请求。
更新:
答案 1 :(得分:9)
Azul在其网站的“下载”部分中提供了OpenJDK的MacOS ARM版本。我还没有尝试过它们,但是Azul是JDK的长期开发人员。
更新:解开Azul JDK的包装后,您必须在其中进行四处逛逛,直到找到System.out.println(data.getClass().getSimpleName()); // "String", "Integer", etc.
目录(假设您已下载jdk11),然后将其复制到zulu-11.jdk
< / p>
答案 2 :(得分:6)
命令行方法(感谢 Homebrew 团队以及 @vladimir-kempik
和 JEP-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,就会被排序。
答案 3 :(得分:5)
我正在使用Azul OpenJDK和Netbeans在新的Apple M1芯片上成功开发Java应用程序。
配置: zulu16.0.65-ea-jdk16.0.0-ea.24-macos_aarch64 Netbeans 12.1和Maven。
答案 4 :(得分:4)
请到 Azul 网站下载 dmg
https://www.azul.com/downloads/zulu-community/?os=macos&architecture=arm-64-bit&package=jdk
这将被放置在库中,一旦 IntelliJ 识别它,就可以运行了
答案 5 :(得分:3)
不仅仅是JEP-391。 有一个预览分支-https://github.com/openjdk/jdk-sandbox/tree/JEP-391-branch
一个人可以在Intel Mac或直接在Arm Mac上使用交叉编译来构建16-ea 而且运行正常
答案 6 :(得分:2)
Microsoft / Azul似乎是jep-391与Windows端口(jep-388)结合的主要推动力。他们有一个单独的github repository,实际上具有适用于macOS-aarch64的EA版本。
不确定与openjdk回购有什么确切关系。
答案 7 :(得分:2)
您可以下载Liberica JDK
https://bell-sw.com/pages/downloads/?os=macOS&architecture=ARM
在 M1 的 IDEA 中,JetBrains Runtime 也是原生的 (ARM64)。
答案 8 :(得分:1)
以下是安装 Oracle JDK 8 并从 rosetta 运行它的步骤 https://www.oracle.com/in/java/technologies/javase/javase-jdk8-downloads.html
您可以通过打开终端并输入来验证它是否有效 java -version
答案 9 :(得分:1)
只是想说,虽然 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 编译的。
小心!
答案 10 :(得分:1)
您可以使用 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