接着上回说
首先大家得先知道一个事,就是Kotlin分两种文件,一种是 .kt ,一种是 .kts ,这俩文件的区别如下表
| 文件类型 | 编译产物 | 生成的类名 |
|---|---|---|
| .kt | .jar / .class | XxxxxKT |
| .kts | 没有 | 没有 |
也就是说,.kt 相当于一个.cpp那种,需要编译的,而 .kts ,相当于.py,直接就可以执行的脚本
⚠️:生成的类名那里比如文件名是abc.kt,那么生成的类名就是AbcKT(也就是首字母和KT要大写,不要搞错!)
然后就可以搞代码编译了
先创建一个 .kt 文件,比如test.tk
# test.tk
fun main(){
println("Hello World")
}
进入命令行,开始编译,有两种命令都贴出来
# 生成包含 Kotlin runtime的可执行 JAR(可独立运行)
kotlinc test.kt -include-runtime -d test.jar
# 只编译,不包含runtime(体积小,但运行时要保证 classpath 上有 Kotlin runtime)
kotlinc test.kt -d test.jar
编译成功后,运行也有两个
⚠️:注意:和上面那俩是一一对应的
# 含runtime
java -jar hello.jar
# 不含runtime(Ps HelloKt 是编译器对 hello.kt 生成的默认类名)
kotlin -classpath hello.jar HelloKt
那。。。
如果文件名太长怎么办,总不能AjdhdhhshusjajjsjsjhsjsjzjhsuisjsjwiiwiansjsjKT吧,输入就得累s
∴你可以在文件指定一个类
// a.kt
@file:JvmName("MyApp")
fun main() {
println("hello")
}
编译还是正常的,只不过执行时就是这样了
kotlin --classpath a.jar MyApp
仅局限于不包含Runtime的编译
那么,如果是 .kts 文件呢?
首先先新建 .kts 文件,输入以下内容:
# hi.kts
fun main(){
println("Hi there")
}
回到命令行输入以下两个命令任何一个都可以直接执行
kotlin hi.kts
kotlinc -script hi.kts
现在,你已经会基础编译了,那有没有更多的?
有的有的,包有的~
kotlinc 编译参数大全
| 参数 | 说明 |
|---|---|
| -version | 显示编译器版本号 |
| -help / -h | 显示编译所有选项 |
| -nowarn | 不输出任何警告 |
| -Werror | 编译时,有警告就当错误 |
| -verbose | 编译时,输出详细日志 |
| -script | 执行Kotlin脚本(.kts)文件 |
| -script-templates 类 | 指定脚本定义模板类 |
| -kotlin-home “路径” | 自定义Kotlin编译器的home(用于发现runtime库) |
| -language-version “版本” | 按指定的Kotlin版本提供源码兼容性 |
| -api-version 版本 | 只允许使用指定版本捆绑库的声明 |
| -progressive | 使用渐进式编译模式 |
| -P plugin: id :name=值 | 向编译器插件传参 |
| -opt-in 注解 | 启动需要opt-in的API |
| @文件 | 从文件读取编译参数与源文件路径 |
| -classpath / -cp 路径 | 类文件搜索路径,多路径用 :(Linux/macOS)或 ; (Windows)分隔 |
| -d 路径 | 输出目录或 JAR 文件路径 |
| -include-runtime | 把 Kotlin 运行时打进 JAR,使其可独立运行 |
| -jdk-home 路径 | 使用自定义 JDK 目录(默认取 JAVA_HOME ) |
| -jvm-target 版本 | 目标 JVM 字节码版本(1.8/9/10/…/26,默认 1.8) |
| -Xjdk-release=版本 | 指定目标 JDK 版本并限制 API,会自动设 -jvm-target |
| -java-parameters | 为 Java 1.8 方法参数反射生成元数据 |
| -module-name 名称 | 设置生成的 .kotlin_module 文件名 |
| -no-jdk | 不自动把 Java 运行时加入 classpath |
| -no-stdlib | 不自动加入 kotlin-stdlib.jar 与 kotlin-reflect.jar |
| -no-reflect | 不自动加入 kotlin-reflect.jar |
| -expression / -e 代码 | 把给定字符串当作 Kotlin 脚本求值 |
编译实例:
# 编译单文件为可执行 JAR
kotlinc hello.kt -include-runtime -d hello.jar
# 编译到目录(生成 class 文件)
kotlinc hello.kt -d out/
# 编译多文件
kotlinc File1.kt File2.kt -d app.jar
# 指定依赖
kotlinc -cp lib/mylib.jar hello.kt -d hello.jar
# 指定 JVM 目标版本
kotlinc -jvm-target 17 hello.kt -d hello.jar
# 抑制警告 / 警告当错误
kotlinc -nowarn hello.kt -d hello.jar
kotlinc -Werror hello.kt -d hello.jar
# 从参数文件读取选项
kotlinc @options/compiler.options hello.kt
特别的,compiler.options文件示例
-include-runtime
-d
hello.jar
hello.kt
附加用法:
文件 classes.list
hello.kt
那么编译命令就可以简化为
kotlinc @compiler.options @classes.list
嗯嗯,命令行编译就到这里啦~

1131

被折叠的 条评论
为什么被折叠?



