在Windows上打包Kotlin为可执行文件
Cover
Note
Cover from Pixiv たんたんめん 青の世界
前言
我想快速入门Kotlin,所以想直接写一个简单的练手项目,虽然最后也是用了电子铅笔(指AI),通过观察AI的代码,我还是有了一点点进步吧。
这不,这个纯Kotlin项目,我打算用launch4j打包为可执行文件,然后好在朋友们面前炫耀一番。
准备工作
这是我项目中的源文件结构:
src目录
root
├─src
│ main.kt
│ WeatherAnalyzer.kt
│ WeatherCondition.kt
│ WeatherFetcher.kt
可以看到,这是一个简单的Kotlin项目,只有四个文件,其中main.kt是程序的入口。
在打包之前,我已经用IDEA成功运行了程序,这意味这打包所需的文件已经在IDEA默认的构建目录中生成好了:
out目录
root
├─out
│ └─production
│ └─KotlinStudy
│ │ MainKt$main$1.class
│ │ MainKt.class
│ │ WeatherAnalyzer.class
│ │ WeatherAnalyzerKt.class
│ │ WeatherCondition$Cloudy.class
│ │ WeatherCondition$Foggy.class
│ │ WeatherCondition$Rainy.class
│ │ WeatherCondition$Snowy.class
│ │ WeatherCondition$Sunny.class
│ │ WeatherCondition.class
│ │ WeatherConditionKt$findMaxTemperatureChangePeriod$$inlined$sortedBy$1.class
│ │ WeatherConditionKt.class
│ │ WeatherData.class
│ │ WeatherFetcher$fetchWeatherData$2.class
│ │ WeatherFetcher$fetchWeatherUpdates$1$weatherData$1.class
│ │ WeatherFetcher$fetchWeatherUpdates$1.class
│ │ WeatherFetcher.class
│ │ WeatherFetcherKt$test5$1$updatesJob$1$1.class
│ │ WeatherFetcherKt$test5$1$updatesJob$1.class
│ │ WeatherFetcherKt$test5$1.class
│ │ WeatherFetcherKt.class
│ │ WeatherUtils$WeatherConverter.class
│ │ WeatherUtils.class
│ │
│ └─META-INF
│ KotlinStudy.kotlin_module
这主意还是DeepSeek想的。
打包项目JAR
复制编译好的类文件
使用以下的命令将编译好的类文件复制到classes目录下:
1copy_class.bat
chcp 65001
@REM 直接使用 IntelliJ 编译好的类文件(从输出目录复制)
mkdir classes
xcopy /E /I "D:\programing\Kotlin\KotlinStudy\out\production\KotlinStudy\*" "classes\"
复制依赖库
Tip
这个视各项目而定
可以在IDEA中查看自己项目依赖了哪些库,可以手动将这些库的jar文件复制到当前的lib目录中:

也可以让AI帮你生成复制脚本:
在运行时查看调用了哪些jar:

2copy_deps.bat
chcp 65001
@echo off
echo 复制依赖库...
if exist libs rmdir /s /q libs
mkdir libs
copy "C:\Users\user\.m2\repository\org\jetbrains\kotlin\kotlin-stdlib\2.3.0\kotlin-stdlib-2.3.0.jar" libs\
copy "C:\Users\user\.m2\repository\com\google\code\gson\gson\2.13.2\gson-2.13.2.jar" libs\
copy "C:\Users\user\.m2\repository\org\jetbrains\kotlinx\kotlinx-coroutines-core\1.10.2\kotlinx-coroutines-core-1.10.2.jar" libs\
copy "C:\Users\user\.m2\repository\org\jetbrains\kotlinx\kotlinx-coroutines-core-jvm\1.10.2\kotlinx-coroutines-core-jvm-1.10.2.jar" libs\
copy "C:\Users\user\.m2\repository\org\jetbrains\annotations\13.0\annotations-13.0.jar" libs\
copy "C:\Users\user\.m2\repository\com\google\errorprone\error_prone_annotations\2.41.0\error_prone_annotations-2.41.0.jar" libs\
echo 依赖库复制完成!
pause
创建 JAR 文件
3create_jar.bat
chcp 65001
@echo off
echo 创建 JAR 文件...
REM 创建清单文件
(
echo Manifest-Version: 1.0
echo Main-Class: MainKt
echo Class-Path: libs/kotlin-stdlib-2.3.0.jar libs/gson-2.13.2.jar libs/kotlinx-coroutines-core-1.10.2.jar libs/kotlinx-coroutines-core-jvm-1.10.2.jar
echo.
) > manifest.txt
REM 创建 JAR
cd classes
"D:\Program Files\Java\jdk-21.0.10\bin\jar" -cfm ..\KotlinStudy.jar ..\manifest.txt .
cd ..
echo JAR 创建完成!
pause
打包成exe文件
这里采用开源的launch4j工具,它可以将JAR包转换为可执行的exe文件。
下载launch4j
https://launch4j.sourceforge.net/
安装不必说,网上有很多教程,这里不再赘述。
用launch4j打包的流程可以参考:
Launch4j下载、安装和使用教程(附安装包)-51CTO博客
输出文件名可以自定义,jar选刚刚生成的jar文件。
这里注意一下,打包成exe点击的按钮是这个:

成功后log有successfully字样。
结果
我的目录内算是比较狼藉的,生成的exe只有几kb,在我的机器上可以运行,但是别的就不知道了


换个位置就不行了,看来还有依赖:

这是能成功运行的条件:

所有文件加起来不超过4mb,如此强劲,令人惊叹!
目录
正在生成目录...