搶佔先機
VMware 提供培訓和認證,以加速你的進步。
瞭解更多它終於發生了!他們做到了!他們及時做到了,我就可以在路上用我閃亮的新筆記型電腦開始構建應用程式了!太棒了!! Oracle 和 GraalVM 團隊釋出了 GraalVM 和用於 Apple M1 的 GraalVM 原生映象功能! 我已經等待這一天很久很久了! 我在 2020 年宣佈當天就購買了第一臺 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
嗎? 我記得,我不喜歡! 所以我用谷歌搜尋了一下,但一無所獲。 然後,就在我不得不工作的時候,我意識到我了不起的朋友和社群傳奇人物 Matt Raible (@mraible) 已經弄清楚了。 所以我 ping 了一下他,他給我發了這個 他針對 M1 構建和 Spring Native 提交的 issue,詳細說明了他如何讓它工作以及如何驗證中斷。
以下是他的步驟,因為它們適用於我。 注意:我認為他們自 Matt 撰寫部落格的那天起就釋出了更新版本的 GraalVM,因此,我的版本號與他的版本號相差 .1
。
首先,您需要下載開發者預覽版。我正在使用 Java 17 的 22.2.0-dev
。所以我選擇下載此二進位制檔案。
我把那個.tgz
檔案放在我的$HOME/Desktop
上,然後執行這個指令碼來讓它安裝並可用於SDKMan
。這些步驟與 Matt 在他的原始工單中詳細說明的步驟相同。
#!/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
);
搞定:你有一個響應式的,非阻塞的 Web 應用程式,與嵌入式,記憶體中的 SQL 資料庫通訊。 讓我們把這個東西變成一個原生映象。 在命令列上,執行以下咒語
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...