
1. 引言Kotlin 是一门运行在 JVM 上的现代编程语言语法简洁、类型安全并且与 Java 高度互操作。虽然大多数开发者习惯使用 IntelliJ IDEA 或 Android Studio 进行开发但在某些场景下比如 CI/CD 流水线、轻量级脚本、服务器环境或教学演示中使用命令行直接编译 Kotlin 代码反而更加高效和灵活。本文将系统介绍如何使用命令行编译 Kotlin 程序涵盖环境准备、基础编译、依赖管理、打包运行等完整流程并配有丰富的代码实例。2. 环境准备在开始命令行编译之前需要先安装 Kotlin 编译器。Kotlin 官方提供了多种安装方式这里介绍最常用的几种。2.1 安装 JDKKotlin 运行在 JVM 之上因此首先需要安装 JDKJava Development Kit。推荐使用 JDK 8 或更高版本。可以通过以下命令验证 JDK 是否安装成功java -version javac -version如果输出类似下面的信息说明 JDK 已正确安装openjdk version 17.0.8 2023-07-18 OpenJDK Runtime Environment (build 17.0.87) OpenJDK 64-Bit Server VM (build 17.0.87, mixed mode, sharing)2.2 安装 Kotlin 编译器Kotlin 编译器可以通过多种方式安装这里介绍三种主流方式。方式一使用 SDKMAN推荐SDKMAN 是 JVM 生态中非常流行的版本管理工具可以方便地安装和切换 Kotlin 版本curl -s https://get.sdkman.io | bash source $HOME/.sdkman/bin/sdkman-init.sh sdk install kotlin方式二使用 HomebrewmacOSbrew install kotlin方式三直接下载二进制发行版可以从 Kotlin 官方 GitHub Releases 页面下载最新的编译器压缩包解压后将bin目录添加到系统PATH环境变量中。安装完成后验证 Kotlin 编译器是否可用kotlinc -version如果输出类似下面的信息说明 Kotlin 编译器已安装成功info: kotlinc-jvm 1.9.22 (JRE 17.0.87)3. 第一个 Kotlin 程序环境准备好之后我们来编写并编译第一个 Kotlin 程序。3.1 编写源代码创建一个名为Hello.kt的文件内容如下fun main() { println(Hello, Kotlin!) }3.2 编译为字节码使用kotlinc命令将 Kotlin 源码编译为 JVM 字节码kotlinc Hello.kt -include-runtime -d hello.jar参数说明-include-runtime将 Kotlin 运行时库一并打包进生成的 jar 文件中这样生成的 jar 可以直接运行。-d指定输出文件的名称和路径这里输出为hello.jar。编译完成后当前目录下会生成一个hello.jar文件。3.3 运行程序使用java -jar命令运行编译好的 jar 包java -jar hello.jar输出结果Hello, Kotlin!至此我们已经完成了第一个 Kotlin 程序的命令行编译和运行。4. 编译多个源文件实际项目中代码通常会拆分成多个文件。下面演示如何编译多个 Kotlin 源文件。4.1 创建多个源文件创建MathUtils.kt文件object MathUtils { fun add(a: Int, b: Int): Int a b fun multiply(a: Int, b: Int): Int a * b }创建Main.kt文件fun main() { val sum MathUtils.add(3, 5) val product MathUtils.multiply(3, 5) println(Sum: $sum) println(Product: $product) }4.2 编译多个文件在命令行中同时传入多个源文件进行编译kotlinc MathUtils.kt Main.kt -include-runtime -d app.jar运行程序java -jar app.jar输出结果Sum: 8 Product: 154.3 使用通配符编译目录下所有文件当源文件较多时可以使用通配符一次性编译目录下的所有 Kotlin 文件kotlinc src/*.kt -include-runtime -d app.jar这种方式要求所有源文件都位于src目录下。5. 编译为 class 文件除了打包成可执行的 jar 文件也可以只编译生成.class字节码文件便于后续集成到其他构建流程中。5.1 编译生成 class 文件不带-include-runtime参数编译时默认只生成.class文件kotlinc Hello.kt -d classes上述命令会在classes目录下生成HelloKt.class文件。注意Kotlin 文件编译后生成的类名默认是「文件名 Kt」。5.2 查看生成的 class 文件ls classes/输出结果HelloKt.class5.3 运行 class 文件运行 class 文件时需要将 Kotlin 运行时库加入 classpathjava -cp classes:kotlin-stdlib.jar HelloKt其中kotlin-stdlib.jar是 Kotlin 标准库通常位于 Kotlin 编译器安装目录的lib文件夹下。如果使用 SDKMAN 安装可以通过以下命令找到它find ~/.sdkman/candidates/kotlin -name kotlin-stdlib*.jar6. 使用第三方依赖实际开发中经常需要引用第三方库。命令行编译时可以通过-cp参数指定依赖的 jar 文件。6.1 下载第三方库以 Gson 库为例先从 Maven 中央仓库下载gson.jar文件放到项目的libs目录下。6.2 编写使用第三方库的代码创建JsonDemo.kt文件import com.google.gson.Gson data class User(val name: String, val age: Int) fun main() { val user User(Alice, 30) val gson Gson() val json gson.toJson(user) println(json) val parsed gson.fromJson(json, User::class.java) println(Parsed: ${parsed.name}, ${parsed.age}) }6.3 编译并运行编译时通过-cp指定依赖kotlinc JsonDemo.kt -cp libs/gson.jar -include-runtime -d json-demo.jar运行程序java -cp json-demo.jar:libs/gson.jar JsonDemoKt输出结果{name:Alice,age:30} Parsed: Alice, 30注意运行包含第三方依赖的程序时需要将依赖 jar 一并加入 classpath。7. 使用 kotlin 命令直接运行脚本Kotlin 还支持以脚本方式直接运行.kts文件无需先编译成字节码非常适合快速验证代码逻辑。7.1 创建脚本文件创建script.kts文件fun greet(name: String) Hello, $name! val message greet(Kotlin Script) println(message) val numbers listOf(1, 2, 3, 4, 5) val sum numbers.filter { it % 2 0 }.sum() println(Sum of even numbers: $sum)7.2 运行脚本kotlinc -script script.kts输出结果Hello, Kotlin Script! Sum of even numbers: 6脚本模式非常适合编写自动化任务、数据处理脚本等场景。8. 编译选项详解掌握常用的编译选项可以更灵活地控制编译过程。下表列出了kotlinc的常用参数参数说明-d path指定输出文件或目录-include-runtime将 Kotlin 运行时库打包进 jar-cp path指定 classpath用于引用第三方依赖-script以脚本模式运行.kts文件-nowarn不输出警告信息-Werror将警告视为错误-jvm-target version指定目标 JVM 版本如1.8或17-Xopt-in启用实验性 API例如指定 JVM 目标版本进行编译kotlinc Hello.kt -jvm-target 1.8 -include-runtime -d hello.jar9. 实战构建一个命令行计算器下面通过一个完整的实战项目综合运用前面介绍的知识构建一个支持加减乘除的命令行计算器。9.1 项目结构calculator/ ├── src/ │ ├── Calculator.kt │ └── Main.kt └── libs/9.2 编写计算器核心逻辑创建src/Calculator.kt文件object Calculator { fun add(a: Double, b: Double): Double a b fun subtract(a: Double, b: Double): Double a - b fun multiply(a: Double, b: Double): Double a * b fun divide(a: Double, b: Double): Double { require(b ! 0.0) { 除数不能为零 } return a / b } }9.3 编写入口程序创建src/Main.kt文件fun main(args: ArrayString) { if (args.size ! 3) { println(用法: java -jar calculator.jar 数字1 操作符 数字2) println(示例: java -jar calculator.jar 10 5) return } val a args[0].toDouble() val op args[1] val b args[2].toDouble() val result when (op) { - Calculator.add(a, b) - - Calculator.subtract(a, b) * - Calculator.multiply(a, b) / - Calculator.divide(a, b) else - { println(不支持的操作符: $op) return } } println($a $op $b $result) }9.4 编译项目进入项目根目录编译所有源文件cd calculator kotlinc src/*.kt -include-runtime -d calculator.jar9.5 运行计算器java -jar calculator.jar 10 5输出结果10.0 5.0 15.0再测试一下除法java -jar calculator.jar 20 / 4输出结果20.0 / 4.0 5.0测试除数为零的情况java -jar calculator.jar 10 / 0输出结果Exception in thread main java.lang.IllegalArgumentException: 除数不能为零 at Calculator.divide(Calculator.kt:7) at MainKt.main(Main.kt:20)10. 与 Java 代码混合编译Kotlin 与 Java 可以无缝互操作命令行编译同样支持混合编译。10.1 创建 Java 源文件创建JavaGreeting.java文件public class JavaGreeting { public static String greet(String name) { return Hello from Java, name !; } }10.2 创建 Kotlin 源文件创建KotlinMain.kt文件fun main() { val message JavaGreeting.greet(Kotlin) println(message) val kotlinMessage greetFromKotlin(Java) println(kotlinMessage) } fun greetFromKotlin(name: String): String Hello from Kotlin, $name!10.3 混合编译将 Java 和 Kotlin 源文件一起编译kotlinc JavaGreeting.java KotlinMain.kt -include-runtime -d mixed.jar运行程序java -jar mixed.jar输出结果Hello from Java, Kotlin! Hello from Kotlin, Java!11. 常见问题与排查在命令行编译过程中可能会遇到一些常见问题这里给出排查思路。11.1 找不到 kotlinc 命令如果执行kotlinc提示命令不存在说明 Kotlin 编译器未安装或未加入PATH。请检查安装步骤并确认kotlinc所在目录已加入环境变量。11.2 编译时提示找不到符号当代码引用了其他文件中的类或函数但编译时未将对应源文件一并传入就会出现「找不到符号」的错误。解决方法是把相关源文件全部传给kotlinckotlinc MathUtils.kt Main.kt -include-runtime -d app.jar11.3 运行时提示 NoClassDefFoundError如果编译时未使用-include-runtime运行 class 文件时需要手动将 Kotlin 标准库加入 classpathjava -cp classes:kotlin-stdlib.jar HelloKt11.4 第三方依赖运行时找不到运行包含第三方依赖的程序时需要将依赖 jar 一并加入 classpathjava -cp json-demo.jar:libs/gson.jar JsonDemoKt12. 总结本文系统介绍了 Kotlin 命令行编译的完整流程包括环境准备、单文件编译、多文件编译、class 文件生成、第三方依赖管理、脚本运行、编译选项、混合编译以及常见问题排查。通过丰富的代码实例相信读者已经能够熟练使用kotlinc命令完成 Kotlin 项目的编译和运行。命令行编译虽然不如 IDE 那样可视化但在自动化构建、CI/CD、服务器部署等场景下具有不可替代的优势。掌握这一技能可以让你在更多环境中灵活地使用 Kotlin 进行开发。