簡體   English   中英

適用於 Apple M1 芯片的 Java/JDK

[英]Java/JDK for the Apple M1 chip

是否需要特別發布OpenJDK來支持新的Apple M1芯片?

我看到目前有 macOS/OS X 的 JDK 下載,但這些似乎只適用於 x86 處理器。 那是對的嗎? 如果是這樣,我在哪里可以下載 M1 的 OpenJDK 版本?

是的。

在此頁面上: AdoptOpenJDK 最新版本,您可以從“操作系統”下拉列表中選擇“macOS”,然后從“架構”中選擇,它目前只有 x64,但很快應該有 AArch64 或 ARM64(這些通常是 64 的簡碼-位臂)。 可能,因為蘋果無疑在他們的 M1 設計中內置了一堆擴展,而蘋果也有自己的。

如果您將操作系統保留在“任何”上,您會注意到 aarch64 在那里,這將使您獲得適用於 ARM 處理器的 Linux 版本。 這(可能)不會在 M1 硬件上的 macOS 上運行,但已經完成了 95% 的工作。

所以:它還沒有,但請注意,用於 ARM 的 JDK 已經存在十多年了,雖然 JDK 15 已經放棄了對一系列奇異的操作系統/架構組合(例如Solaris )的支持,但 ARM 開發一直至少保持不變部分相關(即使到目前為止它主要是 Oracle 商業許可產品)。 也就是說:創建一個原生在M1s上運行的adoptopenjdk版本不應該是一項艱巨的努力,所以想必它會發生。 但是,這是一項開源工作,因此,如果您感到焦慮,請務必閱讀並做出貢獻:)

直到 2020 年 11 月 10 日,Apple 才提供有關此架構的任何詳細信息,除非您為其購買了開發套件盒(帶有 A14 芯片的Mac Mini ,它不是 M1 芯片,但我猜它足夠接近),並簽署一個大的保密協議

通常,如果您揮動 NDA,開源項目將盡可能快地向相反的方向運行,因此,如果您不喜歡這種情況,我認為抱怨采用 openjdk 或其他打包程序和開源是不明智的關於它的項目:)

幸運的是,現在它已經發布,不再需要 NDA。 我的假設是,一旦熟悉 OpenJDK 源代碼的人擁有基於 M1 的 macOS 系統進行測試,OpenJDK 源代碼的 ARM 分支 + macOS x64 版本中已經存在的 macOS 位可以很容易地組合起來,這意味着應該在一個月內發布一個采用openjdk macos-aarch64 的版本。

但是,開源。 你沒有付錢給他們,你沒有合同,他們也不欠你的。 如果您希望它更快地進行,請為這項工作捐款或提供拉取請求。

更新:

  • Azul 的 M1 OpenJDK 構建
  • 微軟(是的,真的) GitHub 源代碼庫,用於在 AArch64 上為 macOS 提供早期訪問 OpenJDK16 構建。 請注意,微軟一直致力於 AArch64 的 OpenJDK 分支(用於基於 ARM 的 Windows 10),這可以追溯到:很多艱苦的工作已經完成。

命令行方法(感謝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 提供的屏幕說明進行操作。

Azul在其網站的下載部分提供了 OpenJDK 的 macOS ARM 版本。 雖然我還沒有嘗試過它們,但是 Azul 一直是 JDK 開發人員。

解壓縮 Azul JDK 后,您必須在其中翻找,直到找到zulu-11.jdk目錄(假設您已下載 JDK 11),然后將其復制到/Library/Java/JavaVirtualMachines

您可以使用 sdkman 安裝 Java JDK(請參閱sdkman install ):

vim .sdkman/etc/config

設置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
================================================================================

選擇一個並使用命令sdk install java IDENTIFIER安裝它,即:

sdk install java 8.0.292-zulu

brew install openjdk

就我而言,在 Mac M1 上成功安裝openjdk后, java命令仍然不起作用。 我修復它

brew info openjdk

然后有一個命令

For the system Java wrappers to find this JDK, symlink it with
  sudo ln -sfn /opt/homebrew/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk

執行這個命令和java命令工作

現在,Oracle 的 OpenJDK 17 支持 Apple M1 芯片。 JEP 391的狀態為已關閉並已交付。

您可以從官方網站下載免費的 macOS/AArch64 開源版本的 JDK,版本 17。

我正在使用 Azul OpenJDK 和 NetBeans 在新的 Apple M1 芯片上成功開發 Java 應用程序。

配置:

  • zulu16.0.65-ea-jdk16.0.0-ea.24-macos_aarch64
  • NetBeans 12.1 和 Maven。

我已經嘗試過 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)

如您所見,它說: 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 芯片問題。

我按照以下步驟操作,並且能夠在 Mac M1 上成功運行 JDK 16:

  1. 轉到“Oracle.com”
  2. 轉到產品軟件Java
  3. 點擊“立即下載 Java”
  4. 點擊“JDK下載”
  5. 選擇“macOS 安裝程序”
  6. 安裝 JDK
  7. 嘗試使用任何示例 Java 程序,這應該適合您。

我能夠在我的 Mac M1 上安裝並成功運行它。

請訪問 Azul 站點並下載 .dmg 文件:

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

這將被放置在一個庫中,一旦 IntelliJ IDEA 識別它,它應該可以很好地運行。

這不僅僅是 JEP-391。

有一個預覽分支, https://github.com/openjdk/jdk-sandbox/tree/JEP-391-branch ,可以在 Intel Mac 或直接在 ARM 上使用交叉編譯構建 JDK 16 early-access (EA)蘋果電腦。 它運行良好。

您可以從以下位置下載 Liberica JDK:

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

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

Microsoft 和Azul似乎是JEP 391與 Windows 端口 (JEP 388) 結合的主要推動者。 他們有一個單獨的 GitHub 存儲庫,實際上有一個 macOS-aarch64 的EA版本。

我不確定與 OpenJDK 存儲庫的確切關系。

只需使用轉到Java 下載並在菜單中

選擇 java 18 & macOS 並下載Arm 64 DMG 安裝程序

您可以通過打開終端並鍵入以下內容來驗證它是否有效:

java -version

以下是安裝 Oracle JDK 8 並從Rosetta運行它的步驟 - https://www.oracle.com/in/java/technologies/javase/javase-jdk8-downloads.html

  • 下載 macOS x64 版本
  • 嘗試安裝軟件包時,如果 Rosetta 不存在,您將收到安裝提示
  • 其余的安裝步驟與任何其他軟件包一樣。

您可以通過打開終端並鍵入以下內容來驗證它是否有效:

java -version

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM