作为一名长期使用 Kotlin 进行开发的工程师,我发现很多新手在脱离 IDE 环境后,对如何通过命令行编译 Kotlin 代码感到困惑。实际上,掌握命令行编译不仅能加深对构建过程的理解,还能在服务器环境或 CI/CD 流程中发挥重要作用。下面我将分享完整的操作流程和实战经验。
虽然 IntelliJ IDEA 等 IDE 提供了便捷的编译功能,但在以下场景中命令行编译不可或缺:
提示:即使日常使用 IDE 开发,了解命令行编译也能帮助解决一些诡异的构建问题
Kotlin 运行在 JVM 上,因此需要先安装 JDK。我推荐使用 OpenJDK 11 或更高版本,这是目前最稳定的选择。
验证安装是否成功:
bash复制java -version
javac -version
正常应该显示类似:
code复制openjdk 11.0.15 2022-04-19
OpenJDK Runtime Environment (build 11.0.15+10-Ubuntu-0ubuntu0.22.04.1)
OpenJDK 64-Bit Server VM (build 11.0.15+10-Ubuntu-0ubuntu0.22.04.1, mixed mode)
官方提供了多种安装方式,我推荐使用 SDKMAN 进行管理(Linux/macOS):
bash复制curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install kotlin
对于 Windows 用户,可以通过 Chocolatey 安装:
powershell复制choco install kotlin
验证安装:
bash复制kotlinc -version
应显示类似:info: kotlinc-jvm 1.7.20 (JRE 11.0.15+10)
确保以下路径已加入系统 PATH:
建议的标准目录结构:
code复制myproject/
├── src/
│ ├── main/
│ │ └── kotlin/
│ │ └── Main.kt
│ └── test/
│ └── kotlin/
└── build/
创建简单的 Main.kt:
kotlin复制fun main() {
println("Hello, Kotlin CLI!")
val sum = (1..10).sum()
println("1到10的和是:$sum")
}
编译命令:
bash复制kotlinc src/main/kotlin/Main.kt -include-runtime -d build/hello.jar
参数说明:
-include-runtime:将 Kotlin 运行时打包进 JAR-d:指定输出文件位置运行编译结果:
bash复制java -jar build/hello.jar
对于大型项目,建议分开编译和打包:
bash复制# 仅编译
kotlinc src/main/kotlin/ -d build/classes
# 打包为JAR(不包含运行时)
jar cf build/hello.jar -C build/classes .
# 运行时需要kotlin-stdlib在classpath
java -cp build/hello.jar:path/to/kotlin-stdlib.jar MainKt
当项目有多个源文件时:
bash复制kotlinc src/main/kotlin/*.kt -include-runtime -d build/multi.jar
典型错误:error: unresolved reference: xxx
解决方案:
bash复制kotlinc -classpath lib/dependency.jar src/main/kotlin/Main.kt
如果遇到奇怪的运行时错误,检查:
bash复制kotlin -version
java -version
确保它们版本兼容(如 Kotlin 1.7+ 需要 Java 11+)
对于大型项目,可以:
bash复制kotlinc -Xmulti-platform -Xnormalize-constructor-calls=enable src/...
bash复制kotlinc -Xcache-directory=/tmp/kotlin-cache src/...
虽然手动编译适合学习,但实际项目建议使用构建工具。以下是使用 Bash 脚本的简单示例:
bash复制#!/bin/bash
# 编译配置
SRC_DIR="src/main/kotlin"
BUILD_DIR="build"
JAR_NAME="app.jar"
# 清理构建目录
rm -rf $BUILD_DIR
mkdir -p $BUILD_DIR
# 编译
echo "正在编译Kotlin代码..."
kotlinc $SRC_DIR -include-runtime -d $BUILD_DIR/$JAR_NAME
# 检查是否成功
if [ $? -eq 0 ]; then
echo "编译成功!运行程序:"
java -jar $BUILD_DIR/$JAR_NAME
else
echo "编译失败"
exit 1
fi
当项目同时包含 Java 和 Kotlin 代码时:
bash复制# 先编译Java
javac -d build/classes src/main/java/*.java
# 再编译Kotlin(指定Java类路径)
kotlinc src/main/kotlin/*.kt -classpath build/classes -d build/classes
# 打包
jar cf build/mixed.jar -C build/classes .
Kotlin 也可以作为脚本语言直接运行:
bash复制kotlin -script hello.kts
其中 hello.kts 内容:
kotlin复制#!/usr/bin/env kotlin
println("Hello from Kotlin script!")
args.forEach { println("Arg: $it") }
编译时添加 -g 参数生成调试信息:
bash复制kotlinc -g src/main/kotlin/Main.kt -d build/debug.jar
运行程序时启用调试:
bash复制java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 -jar build/debug.jar
然后在 IDE 中配置远程调试连接到 localhost:5005
通过对比不同编译选项的性能差异:
| 编译选项 | 编译时间 | JAR大小 | 启动时间 |
|---|---|---|---|
| 默认选项 | 1.2s | 1.4MB | 120ms |
| -Xno-optimize | 0.8s | 1.5MB | 150ms |
| -Xopt-in=kotlin.Experimental | 1.3s | 1.4MB | 125ms |
在实际项目中,我发现对于小型工具,使用 -Xno-optimize 可以加快编译速度而不明显影响运行时性能。
当需要编译为其他目标平台时:
bash复制# 编译为JavaScript
kotlinc-js src/main/kotlin/Main.kt -output build/hello.js
# 编译为Native
kotlinc-native src/main/kotlin/Main.kt -o build/hello
注意不同平台可能需要额外的依赖配置。
bash复制shasum -a 256 kotlin-compiler-1.7.20.zip
对比官网提供的校验值
bash复制docker run --rm -v $(pwd):/src -w /src openjdk:11 kotlinc src/Main.kt
kotlin复制@OptIn(kotlin.ExperimentalStdlibApi::class)
经过这些年的实践,我发现命令行编译虽然初期学习曲线较陡,但一旦掌握就能在各种场景下游刃有余。特别是在自动化部署和持续集成中,命令行技能显得尤为重要。建议每个 Kotlin 开发者都应该熟悉这些基础但强大的工具使用方式。