領先一步
VMware 提供培訓和認證,以加速您的進度。
了解更多終於發生了!他們做到了!他們及時做到了,讓我可以開始在路上使用我閃亮的新筆記型電腦來建置應用程式!太棒了!! Oracle 和 GraalVM 團隊發布了 GraalVM 以及 Apple M1 的 GraalVM 原生映像檔功能!我已經等這一天很久、很久、很久了!早在 2020 年(還有人記得那麼久以前的事嗎? 從氣象學的角度來說,那是疫情初期),我就在 Apple M1 發布的當天買了第一台 Apple M1。
Apple 的 M1 裝置是速度快得驚人、節能的機器野獸,除了最強大和最新穎的 Intel/NVidia 配置外,其他所有配置都能輕鬆超越,同時也只消耗其他配置所耗費的一小部分電力。 簡而言之,我是個大粉絲。 但是,轉移到這種新架構並非沒有問題。
某些 Adobe 應用程式(例如 Adobe Premiere 和 Adobe After Effects)、Docker 和 GraalVM 是使我的 M1 機器(我後來從第一台 13 吋 MacBook Pro 2020 M1 升級到 16 吋 MacBook Pro 2021 M1 Max 型號)成為我的日常主要機器的最大障礙。 Docker 已經變得更好了。 Adobe Premiere 變得更好了,After Effects 也不落後太多(但仍然沒有什麼進展)。 而現在,截至昨天,終於,GraalVM 變得更好了。
但是,它還不是 GA(正式發布版),甚至還沒有包含在出色的 SDKman 專案中。 因此,安裝它可能很乏味。 你們都記得手動將東西添加到你的 PATH
嗎? 我記得,而且我不喜歡它! 所以我用 Google 搜尋了一下,但一無所獲。 然後,正當我不得不工作時,我才意識到我令人難以置信的朋友和社群傳奇人物 Matt Raible (@mraible) 已經弄清楚了。 所以我 ping 了他,他寄給我這張 他針對 M1 版本和 Spring Native 提交的 issue,詳細說明了他如何讓它運作以及如何驗證中斷。
以下是他應用於我的步驟。 注意:我認為自 Matt 撰寫部落格以來,他們甚至在一天前就發布了更新版本的 GraalVM,因此,我的版本號碼與他的版本號碼相差 .1
。
首先,你需要下載開發者預覽版本。 我正在使用適用於 Java 17 的 22.2.0-dev
。 所以我選擇下載此二進位檔。
我將該 .tgz
檔案放在我的 $HOME/Desktop
上,然後執行此指令碼以使其安裝並可供 SDKMan
使用。 這些與 Matt 在其原始 issue 中詳細說明的步驟相同。
#!/usr/bin/env bash
BUILD=22.2.0
INSTALLED_PATH=$HOME/.sdkman/candidates/java/${BUILD}.dev.r17-grl
cd $HOME/Desktop/
rm -rf graalvm-ce-java17-${BUILD}-dev || echo "no directory to delete."
tar zxpf graalvm-ce-java17-darwin-aarch64-dev.tar.gz
rm -rf $INSTALLED_PATH || echo "no directory to delete."
mv $HOME/Desktop/graalvm-ce-java17-${BUILD}-dev/Contents/Home $INSTALLED_PATH
sudo xattr -r -d com.apple.quarantine ~/.sdkman/candidates/java/${BUILD}.dev.r17-grl
將所有這些說明放在你的 $HOME/Desktop
上名為 install.sh
的文字檔中,然後執行 chmod a+x $HOME/Desktop/install.sh
以使其可執行,然後使用 $HOME/Desktop/install.sh
執行它。
你需要使這個新安裝的版本成為你作業系統的預設版本,因此請發出以下命令
BUILD=22.2.0
sdk default java ${BUILD}.dev.r17-grlz
完成後,你需要使用 GraalVM 發行版中的 gu
實用程式安裝 native-image
編譯器命令
gu install native-image
開啟一個新的 shell 並驗證一切是否正常運作
➜ java --version
openjdk 17.0.3 2022-04-19
OpenJDK Runtime Environment GraalVM CE 22.2.0-dev (build 17.0.3+4-jvmci-22.1-b03)
OpenJDK 64-Bit Server VM GraalVM CE 22.2.0-dev (build 17.0.3+4-jvmci-22.1-b03, mixed mode, sharing)
有了它,你應該一切都準備好了。 然後你需要一個應用程式來進行測試。 所以前往我在網路上第二喜歡的地方,start dot spring dot io,並產生一個預先配置好所有內容的新應用程式。 按一下 Generate
,然後解壓縮並在您選擇的 Java IDE 中開啟產生的 pom.xml
。
將 M1NativeApplication.java
替換為以下內容
package com.example.m1native;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.annotation.Id;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.ServerResponse;
import static org.springframework.web.reactive.function.server.RouterFunctions.route;
import static org.springframework.web.reactive.function.server.ServerResponse.ok;
@SpringBootApplication
public class M1nativeApplication {
public static void main(String[] args) {
SpringApplication.run(M1nativeApplication.class, args);
}
@Bean
RouterFunction<ServerResponse> routes(CustomerRepository repository) {
return route()
.GET("/customers", request -> ok().body(repository.findAll(), Customer.class))
.build();
}
@Bean
ApplicationRunner runner(CustomerRepository repository) {
return args -> repository.findAll().subscribe(System.out::println);
}
}
interface CustomerRepository extends ReactiveCrudRepository<Customer, Integer> {
}
record Customer(@Id Integer id, String name) {
}
新增 src/main/resources/data.sql
insert into customer (name ) values('Josh');
insert into customer (name ) values('Mario');
insert into customer (name ) values('Amey');
新增 src/main/resources/schema.sql
create table if not exists customer
(
id serial primary key,
name varchar(255) not null
);
你已經準備好了:你擁有一個與嵌入式記憶體內 SQL 資料庫交談的反應式、非阻塞式 Web 應用程式。 讓我們把它變成一個原生映像檔。 在命令列上,執行以下咒語
mvn -Pnative -DskipTests clean package
這需要大約 45 秒才能完成。 喝幾口咖啡,然後在你的 target/ 目錄中執行應用程式
➜ target/m1native
...
2022-03-23 16:24:15.063 INFO 13901 --- [ ... ] Started M1nativeApplication in 0.036 seconds (JVM running for 0.038)
Customer[id=1, name=Josh]
Customer[id=2, name=Mario]
Customer[id=3, name=Amey]
太棒了! GraalVM 萬歲! 這太棒了! 我知道肯定會有錯誤或問題,但對於一個開發者預覽版本來說,它運作得如此出色? 這太棒了。
現在要弄清楚如何處理我那台嘎嘎作響且無關緊要的 Intel MacBook Pro 了...