领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多它终于发生了!他们做到了!他们恰好在我要上路并开始用我的闪亮的新笔记本电脑在路上构建应用程序之前做到了!太棒了!!Oracle 和 GraalVM 团队发布了适用于 Apple M1 的 GraalVM 和 GraalVM 原生镜像功能!我已经期待这一天很久很久很久了!早在 2020 年发布公告的那天我就购买了第一台 Apple M1(还有人记得那么久以前的事情吗?从气象学上讲,那是大流行初期)。
Apple 的 M1 设备是令人难以置信的快速、节能的机器,其运行速度超过了除最强大和最新款的英特尔/英伟达配置之外的所有配置,同时只消耗其他配置所消耗的一小部分电量。简而言之,我非常喜欢它。但转向这种新架构并非没有问题。
一些 Adobe 应用程序(如 Adobe Premiere 和 Adobe After Effects)、Docker 和 GraalVM 是使我的 M1 机器(我已经从 2020 年第一代 13 英寸 MacBook Pro M1 升级到 2021 年 16 英寸 MacBook Pro M1 Max 型号)成为我的日常驱动程序的最大障碍。Docker 已经变得更好。Adobe Premiere 已经变得更好,After Effects 也落后不远(但仍然没有进展)。现在,截至昨天,GraalVM 终于也变得更好了。
但是,它还没有 GA,甚至不在很棒的 SDKman 项目中。因此,安装它可能很繁琐。你们还记得手动将东西添加到 PATH
中吗?我记得,而且我不喜欢它!所以我用谷歌搜索了一下,但一无所获。然后,就在我认命要开始“工作”的时候,我意识到我不可思议的朋友和社区传奇人物 Matt Raible(@mraible) 已经解决了这个问题。所以我给他发了消息,他给我发来了他针对 M1 构建和 Spring Native 提出的 这个工单,详细说明了他如何让它工作以及如何验证中断。
以下是他的步骤,它们适用于我。注意:我认为他们甚至在 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
将所有这些指令放在桌面上的一个名为 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,并生成一个新的应用程序 并预先配置好所有内容。单击“生成”,然后解压缩并使用您选择的 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 万岁!这太神奇了!我知道肯定会出现错误或问题,但这个开发人员预览版本竟然能运行得如此之好?这太酷了。
现在该想办法处理我那吱吱作响的旧款且无关紧要的英特尔 MacBook Pro 了……