前言
作为一个码农,经常会需要处理一些零碎小需求,如批量处理数据(过程包含下载文件、Excel导入导出、数据库查询),这类需求与成体系的项目不同,一般是比较独立的、临时性的、做完就没什么用的、逻辑零散的。不知道大家一般怎么应对这类需求,笔者倾向于使用脚本语言来解决, 也正是本文要介绍的主角 ———
Kotlin脚本(kts)
💥 核心优势 💥
- 语法简洁:得益于
Kotlin现代简洁语法和大量语法糖,简直天选脚本语言 - 生态丰富:Kotlin可与
Java互相调用,也就意味着开源生态Java能用的库我们都能拿来直接用 - 兼容性强:首先在JVM上,Kotlin可与Java互相调用,也就意味着你写完的脚本如果将来在正式需求也有用,直接粘过去就可以了,测试代码可直接“转正”;其次Kotlin现在在布局跨平台,有
Native部分,你的测试代码如果有需要也可以拿到其他地方去使用,含金量拉满。
Hello Kts !
开始使用之前,需要安装kotlin运行时(就如同要跑python脚本需要先安装python)
安装过程本文不赘述,以windows举例,解压后目录如下:
把bin下的内容加到PATH, 打开控制台,输入kotlinc,看到以下打印即为成功:
接下来我们随便找个目录,创建一个脚本文件:hello-world.kts(kotlin脚本文件的后缀是.kts)
println("Hello Kotlin Script !")
然后打开控制台或powershell,输入以下指令:
kotlinc -scirpt hello-world.kts
看到成功打印,脚本运行成功:
更多功能
添加仓库及依赖
以上只是最基础的Hello World示例,实际使用时我们一般还需要引用外部库,这种场景下首先需要将文件后缀名更改:
.kts -> .main.kts // 文件后缀需要增加.main
然后外部库引用语法如下:
@file:DependsOn("cn.hutool:hutool-all:5.8.26")
类似于gradle的引用语法,这样你就可以使用外部库了。我们可以丰富一下之前的hello-world示例:
@file:DependsOn("cn.hutool:hutool-all:5.8.26")
import cn.hutool.core.util.RandomUtil
println("Hello Kotlin Script !")
println("随机数:${RandomUtil.randomInt()}")
你会得到以下打印:
PS E:\> kotlinc -script .\hello-world.kts
Hello Kotlin Script !
随机数:-1413056019
如果你的依赖下载很慢,需要添加镜像仓库和私服仓库,语法如下:
@file:Repository("http://10.99.20.135:8081/repository/maven-public/")
PS: 以上两个注解的内容,既可以一行内添加多个内容,用逗号隔开,又可以用多行注解来实现,非常灵活,即:
@file:DependsOn("org.flowable:flowable-engine:6.6.0","mysql:mysql-connector-java:8.0.22")
等价于
@file:DependsOn("org.flowable:flowable-engine:6.6.0")
@file:DependsOn("mysql:mysql-connector-java:8.0.22")
添加本地依赖
除了外部引用之外,我们通常还需要引入一些我们自己写的功能,你只需要把你的Java或Kotlin类编译成class后,使用如下语法引入即可:
@file:DependsOn("E:\Projects\lite\kotlin-scripts\build\classes\java\main")
以上为windows下系统的一个示例,DependsOn内的内容为Class文件的绝对路径,相对路径是不支持的。
将以上特性都运用好后,你可以运行一个综合示例:
#!/usr/bin/env kotlin
@file:Repository("https://maven.aliyun.com/repository/public/")
// @file:DependsOn("<path-to-your-project>/build/classes/kotlin/main")
// @file:DependsOn("<path-to-your-project>/build/classes/java/main")
// @file:DependsOn("<path-to-your-project>/build/resources/main")
@file:DependsOn("E:\Projects\@lite\kotlin-scripts\build\classes\kotlin\main")
@file:DependsOn("E:\Projects\@lite\kotlin-scripts\build\classes\java\main")
@file:DependsOn("cn.hutool:hutool-all:5.8.38")
import cn.hutool.core.util.RandomUtil
import org.example.HelloJava
import org.example.HelloKotlin
println("👏欢迎使用Kotlin脚本!")
println("==== 本地class调用测试 ====")
HelloKotlin.sayHello()
HelloJava.sayHello()
println("==== maven依赖调用测试 ====")
println("随机数:${RandomUtil.randomInt()}")
IDE和工程、调试
使用IDEA编写脚本
以上就是Kotlin脚本的基础使用方法,实际我们使用时,肯定不能全手搓,那么是时候使用最强大的IDE: IntelliJ IDEA,来建立一个简单的工程:
我们创建一个Kotlin工程,使用Gradle构建,默认情况下,Gradle的下载很慢,我们添加一下国内的镜像仓库:
> settings.gradle.kts:
pluginManagement {
repositories {
maven { url = uri("https://maven.aliyun.com/repository/public/") }
maven { url = uri("https://maven.aliyun.com/repository/gradle-plugin/") }
mavenLocal()
mavenCentral()
gradlePluginPortal()
}
}
> build.gradle.kts
repositories {
maven { url = uri("https://maven.aliyun.com/repository/public/") }
maven { url = uri("https://maven.aliyun.com/repository/central/") }
mavenLocal()
mavenCentral()
}
等gradle构建完后,运行自带的Main方法,不报错即为成功。
然后我们在项目里创建一个scripts目录,专门放我们的脚本文件(叫别的也行,随便叫)
再修改一下build.gradle.kts文件,专门声明一下Kotlin和Java类的位置:
sourceSets {
main {
kotlin.srcDirs("src/main/kotlin")
java.srcDirs("src/main/kotlin")
}
test {
kotlin.srcDirs("src/test/kotlin")
java.srcDirs("src/test/kotlin")
}
}
我这段的意思是Kotlin和Java类都放在了src/main/kotlin目录下,图个懒,正常是Kotlin放在src/main/kotlin下,Java类放在src/main/java目录下,如果你按照这种默认配置来,也可以不用配这段。
接下来的事情就很清晰了,如果你需要写一些本地依赖,那就在src下写你的代码,写完后用gradle构建一下class出来,然后构建出来的class一般都在项目同级目录下的build底下,把这个的全路径添加到脚本中即可。
你的脚本文件则放到scripts路径下开发,与其他正常代码是独立的,这也是官方推荐的做法,如果你把脚本文件放到source里了,IDEA会警告你,并且会出现一些莫名其妙的问题。
当修改了脚本的依赖后,IDEA会提示你“应用上下文”,点击那个后才会把库引入,这个过程有时候会卡,现在体验不是很好。希望后续官方能修复一下。
调试
在IDEA内,也可以右键脚本文件来进行调试,和你自己用命令运行的结果是一样的,但是可以使用IDEA逐行调试代码。
Write Once,Run Everywhere
脚本在你的机器上写完后,如果想在其他的操作系统或别人电脑、服务器上运行,那么只需要安装JDK、Kotlin运行时,使用
kotlinc -script *.main.kts
即可运行脚本,脚本中所涉及的jar包会在初次运行时即时下载;如果脚本中有需要本地的class,需要编译后将产物一并带上,注意路径和脚本中的一致性。
总结
以上就是Kotlin脚本我所知的全部使用技巧,Kotlin语言本身在国内就比较冷门,Kotlin脚本更是没啥人用,官方也把它列为实验性的功能,关于Kotlin脚本的资料也是少之又少,本文内容都是本人查阅官方文档及相关社区总结而来,希望能帮助到需要这些资料的人少走一些弯路。