前言
除了最新新出的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,回来把语言包的中文去掉,选上英文。
下载graalvm-jdk
现在大都使用idea进行开发,在File -->**Project Structre…**里可以直接下载,如下图所示,选graalvm-jdk-21就可以了。下载时间比较长,耐心等待一会。
安装完以后先别急着去改什么环境变量,我们全程在idea上操作的话是用不到这些配置的。另外网上有一些其他的教程会介绍手动安装native-image,这个也不需要,这样下载下来的jdk里是自带有的。至于native-image的作用,就是使用这个东西将java程序打成exe的。
编译Native Image
接下来介绍关键的步骤,将我们的代码编译成本地可执行文件。我们仍然不需要用什么复杂的命令,直接用idea的maven插件来完成。
创建项目
首先新建一个maven项目,结构如图所示,Test里就是经典的Hello World:
配置pom
接下来我们在pom.xml中换到阿里云的下载源,在最后添加上:
<pluginRepositories><pluginRepository><id>aliyun</id><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public</url></pluginRepository></pluginRepositories>
为了能直接使用maven插件来打包,我们需要在刚才的标签上面添加上:
<profiles><profile><id>native</id><build><plugins><plugin><groupId>org.graalvm.buildtools</groupId><artifactId>native-maven-plugin</artifactId><version>0.9.28</version><extensions>true</extensions><executions><execution><id>build-native</id><goals><goal>build</goal></goals><phase>package</phase></execution></executions><configuration><fallback>false</fallback></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
就可以了。当然,环境还是需要再配一遍的。
贴一下官方的文档,不需要翻墙,但是英文的:
- https://docs.oracle.com/en/graalvm/jdk/21/docs/solutions-overview/#oracle-graalvm
- https://www.graalvm.org/latest/guides/?topic=all
- https://graalvm.github.io/native-build-tools/latest/maven-plugin.html