使用 native-image 编译 Kotlin / Java 编写的小工具成 Windows 下 .exe 可执行文件


前言

使用 Kotlin 写了个小工具,想要发给不懂编程的朋友用,便想到将其先编译成 .exe 文件,搜了下应该是可以使用 Kotlin-native 或者 GraalVM 的 native-image 来编译。这篇文章里使用 IDEA 将程序打包成 jar 再使用 native-image 将 jar 编译成 .exe 文件。


一、思路

先使用 IDEA 将程序打包成 jar, 再使用 native-image-agent 来检测并收集代码运行时的依赖信息,记录反射和资源使用情况,生成并写入相关配置文件。最后用 native-image 编译时使用相关的配置文件。

二、前提

1. Prerequisites for Using Native Image on Windows

To start using Native Image on Windows, install Visual Studio and Microsoft Visual C++ (MSVC). There are two installation options: * Install the Visual Studio Build Tools with the Windows 10 SDK * Install Visual Studio with the Windows 10 SDK

You can use Visual Studio 2017 version 15.9 or later.

解释:

使用 native-image 需要安装Visual Studio相关的工具。有两个选项:
一、安装Visual Studio Build Tools 和 Windows 10 SDK
这是一个精简版的只包含了编译相关工具链的安装包,不包含完整的IDE。但已足够支持Native Image。
二、完整安装Visual Studio IDE,同时选择包含Windows 10 SDK
这是完整功能的IDE集成开发环境。
原因是Native Image编译器在Windows上需要借助Visual C++编译器和Windows SDK来生成本地代码。这需要相应的工具链支持。
所以简单总结下需要这两个选择中的一个:
1.Visual Studio Build Tools
2.Visual Studio IDE
以及Windows 10 SDK。有了这些工具链和系统开发包的支持,才能让Native Image顺利在Windows上工作。

2. 下载 GraalVM

官网下载地址

3. 系统变量的配置

略…

三、步骤

1. 使用 IDEA 或其他方式将代码打包成 jar

Project Structure (Ctrl + Alt + Shift + S) -> Artifacts -> + -> JAR -> From modules with dependencies… -> main class(选择主类) -> OK -> Apply -> 删除不必要的依赖 -> OK

Build -> Build Artifacts -> Build

2. 使用native-image-agent生成配置文件

以下操作的目录可自己选择,这里展示的是在 jar 所在目录中进行操作
在生成的 jar 所在的目录中创建META-INF/native-image文件夹(可省略;文件夹名也可改,但后面的命令中的路径也需要一并修改)

在jar包所在的目录下运行以下命令:
注意替换 {jar包} 为前面打包生成的 .jar 文件

java -agentlib:native-image-agent=config-output-dir=META-INF/native-image -jar {jar包}

运行尽可能多的分支,然后结束程序,此时会在META-INF/native-image文件夹中生成配置文件

若一次运行不够,可以采用以下命令运行并自动合并配置文件:

java -agentlib:native-image-agent=config-merge-dir=META-INF/native-image -jar {jar包}

3. 使用native-image生成可执行文件

native-image --no-fallback -H:ConfigurationFileDirectories=META-INF/native-image -jar {jar包} {可执行文件名}

貌似GraalVM的native-image默认会生成依赖JDK的可执行文件,这样可执行文件必须在有JDK的环境下才能运行。
所以为了生成在其他没有JDK的机器上能执行的可执行文件,这里使用了 --no-fallback 参数禁用 fallback-image 的生成。

应该有其他编译出不依赖JDK的纯native执行文件的方法,但我没有深入探究。

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值