向你推荐Kotlin脚本的使用技巧

61 阅读4分钟

前言

作为一个码农,经常会需要处理一些零碎小需求,如批量处理数据(过程包含下载文件、Excel导入导出、数据库查询),这类需求与成体系的项目不同,一般是比较独立的、临时性的、做完就没什么用的、逻辑零散的。不知道大家一般怎么应对这类需求,笔者倾向于使用脚本语言来解决, 也正是本文要介绍的主角 ———

Kotlin脚本(kts)

💥 核心优势 💥

  • 语法简洁:得益于Kotlin现代简洁语法和大量语法糖,简直天选脚本语言
  • 生态丰富:Kotlin可与Java互相调用,也就意味着开源生态Java能用的库我们都能拿来直接用
  • 兼容性强:首先在JVM上,Kotlin可与Java互相调用,也就意味着你写完的脚本如果将来在正式需求也有用,直接粘过去就可以了,测试代码可直接“转正”;其次Kotlin现在在布局跨平台,有Native部分,你的测试代码如果有需要也可以拿到其他地方去使用,含金量拉满。

Hello Kts !

开始使用之前,需要安装kotlin运行时(就如同要跑python脚本需要先安装python) 安装过程本文不赘述,以windows举例,解压后目录如下:

image.png

把bin下的内容加到PATH, 打开控制台,输入kotlinc,看到以下打印即为成功:

image.png

接下来我们随便找个目录,创建一个脚本文件:hello-world.kts(kotlin脚本文件的后缀是.kts)

println("Hello Kotlin Script !")

然后打开控制台或powershell,输入以下指令:

kotlinc -scirpt hello-world.kts

看到成功打印,脚本运行成功:

image.png

更多功能

添加仓库及依赖

以上只是最基础的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")

添加本地依赖

除了外部引用之外,我们通常还需要引入一些我们自己写的功能,你只需要把你的JavaKotlin类编译成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,来建立一个简单的工程:

image.png

image.png

我们创建一个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目录,专门放我们的脚本文件(叫别的也行,随便叫)

image.png

再修改一下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会警告你,并且会出现一些莫名其妙的问题。

image.png

当修改了脚本的依赖后,IDEA会提示你“应用上下文”,点击那个后才会把库引入,这个过程有时候会卡,现在体验不是很好。希望后续官方能修复一下。

image.png

调试

在IDEA内,也可以右键脚本文件来进行调试,和你自己用命令运行的结果是一样的,但是可以使用IDEA逐行调试代码。

image.png

Write Once,Run Everywhere

脚本在你的机器上写完后,如果想在其他的操作系统或别人电脑、服务器上运行,那么只需要安装JDK、Kotlin运行时,使用

kotlinc -script *.main.kts

即可运行脚本,脚本中所涉及的jar包会在初次运行时即时下载;如果脚本中有需要本地的class,需要编译后将产物一并带上,注意路径和脚本中的一致性。

总结

以上就是Kotlin脚本我所知的全部使用技巧,Kotlin语言本身在国内就比较冷门,Kotlin脚本更是没啥人用,官方也把它列为实验性的功能,关于Kotlin脚本的资料也是少之又少,本文内容都是本人查阅官方文档及相关社区总结而来,希望能帮助到需要这些资料的人少走一些弯路。