Kotlin备忘录—命令行编译

接着上回说


首先大家得先知道一个事,就是Kotlin分两种文件,一种是 .kt ,一种是 .kts ,这俩文件的区别如下表

文件类型编译产物生成的类名
.kt.jar / .classXxxxxKT
.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

嗯嗯,命令行编译就到这里啦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pilot-Hao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值