前言
除了最新新出的jdk21以外,oracle还推出了重磅的graalvm-jdk-21。这个graalvm可以把java代码编译为本地执行文件,就是把原来的jar包直接打成exe。并且使用打完的exe占用的内存资源更小,启动速度更快,非常适合云平台部署,只是打包的时间比原来长了很多。实际用的话我们仍然可以在windows平台开发,将开发好的程序放到linux平台打成占用内存小、启动速度快的可执行文件。下面来介绍一下在Windows平台下安装和编译本地程序的过程。
在Windows平台编译要提前下载好相关的C++工具,可以使用Visual Stidio直接来安装。如下图:在单个组件里选下面这些。如果你使用的时Windows10,那么最后一项安装Windows10 SDK也可以。

下载安装完以后记得重启一下。
注意:如果后面遇到报错native-image building on Windows currently only supports target architecture: AMD64,回来把语言包的中文去掉,选上英文。
现在大都使用idea进行开发,在File -->**Project Structre…**里可以直接下载,如下图所示,选graalvm-jdk-21就可以了。下载时间比较长,耐心等待一会。

安装完以后先别急着去改什么环境变量,我们全程在idea上操作的话是用不到这些配置的。另外网上有一些其他的教程会介绍手动安装native-image,这个也不需要,这样下载下来的jdk里是自带有的。至于native-image的作用,就是使用这个东西将java程序打成exe的。
接下来介绍关键的步骤,将我们的代码编译成本地可执行文件。我们仍然不需要用什么复杂的命令,直接用idea的maven插件来完成。
首先新建一个maven项目,结构如图所示,Test里就是经典的Hello World:

接下来我们在pom.xml中换到阿里云的下载源,在最后添加上:
<pluginRepositories>
<pluginRepository>
<id>aliyunid>
<name>阿里云公共仓库name>
<url>https://maven.aliyun.com/repository/publicurl>
pluginRepository>
pluginRepositories>
为了能直接使用maven插件来打包,我们需要在刚才的标签上面添加上:
<profiles>
<profile>
<id>nativeid>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtoolsgroupId>
<artifactId>native-maven-pluginartifactId>
<version>0.9.28version>
<extensions>trueextensions>
<executions>
<execution>
<id>build-nativeid>
<goals>
<goal>buildgoal>
goals>
<phase>packagephase>
execution>
executions>
<configuration>
<fallback>falsefallback>
configuration>
plugin>
plugins>
build>
profile>
profiles>
这个是oracle的一个maven插件,有了它我们就能看到idea的maven插件变成了这样:

这时候双击上图的package就能看到下面正在执行打包命令了,如果这里碰到报错native-image building on Windows currently only supports target architecture: AMD64,去上文看一下。有一说一,打包的时间还是比较长的,一个Hellow World要20s+。打完之后看一下目录结构,那个fortune.exe就是我们打出来的本地镜像了:

这个文件双击执行就可以了,如果看一闪而过不过瘾,可以在输出的语句上加个while循环。
这篇文章相比网上能找到的教程,我自认为更贴地气,贴近实际开发流程。前面一开始说过,我们通常是在Windows上开发,但是程序是部署在Linux上的,那么怎么能编译成Linux的可执行文件呢? 我没搜到直接在Windows上编的办法,但是可以使用native-image编译jar包。我们把Windows打好的jar包放到Linux上,然后在Linux上执行native-image -jar native_test.jar native_test就可以了。当然,环境还是需要再配一遍的。
贴一下官方的文档,不需要翻墙,但是英文的: