1.前言
如果我们想学习Kotlin,那势必需要一个平台或者一种方法能够编译运行Kotlin代码。Kotlin官方教程提供了多种方式编译运行Kotlin代码,但个人认为这些方法依赖于IDE或者编辑器,直接使用命令行编译器也比较麻烦。官方教程最后提到可以使用构建工具构建Kotlin项目,鉴于学习Kotlin很大程度上是为了学习安卓开发,而在安卓开发中Gradle是非常重要的工具,所以这篇文章将介绍如何使用Gradle编译运行Kotlin代码,以作为学习Kotlin的入门准备。
2.准备
首先,你必须对Gradle是什么有比较清楚的认识,对此知乎的这个问题上有比较详细的讨论。我个人的理解是Gradle是一款构建工具,如果你有前端的开发经验的话,Gradle在某些程度上类似于Webpack。
其次,你必须先安装Gradle,可以参考官方指引。网络上也有大量的教程,这里就不再赘述。
3.开始
3.1 初始化目录
创建一个目录,比如 basic-demo
,进入到目录中,执行gradle init
初始化目录,运行结果如下:
其中有两步需要选择,第一次是选择项目类型,四个选项言简意赅,这里我们选择basic
,后续有需要再通过配置文件进行配置。第二次是选择配置文件类型,因为我们使用Kotlin进行开发,所以这里就选Kotlin,你也可以在初始化时通过gradle init --dsl kotlin
来设置该选项。
初始化完成后的目录结构应该是这样的:
需要我们关注的是:
- build.gradle.kts:Gradle配置文件
- gradlew:用于在Linux或Mac系统的命令行中执行gradle命令
- gradlew.bat:用于在Windows系统的命令行中执行gradle命令
3.2 创建Kotlin文件
我们在basic_demo的根目录下创建路径src/main/kotlin
,随后在kotlin目录下创建Kotlin文件HelloWorld.kt
至于为什么要把kotlin文件放到src/main/kotlin路径下,后面会有说明,现在就可以编写Kotlin代码了:
// 留意这里的包名是sampleDemo
package sampleDemo
fun main(args: Array<String>) {
println("Hello, world!")
}
3.3 配置build.gradle.kts
在build.gradle.kts中添加如下配置:
/*
* This file was generated by the Gradle 'init' task.
*
* This is a general purpose Gradle build.
* Learn how to create Gradle builds at https://guides.gradle.org/creating-new-gradle-builds
*/
plugins {
// 使用Kotlin插件,以Java VM为目标
kotlin("jvm") version "1.3.61"
// application插件用于创建可执行的JVM应用程序
application
}
application {
// 设置入口文件,这里就是HelloWorld.kt,注意前面的包名sampleDemo
mainClassName = "sampleDemo.HelloWorldKt"
}
repositories {
// 设置依赖库地址,由于墙的缘故,设置为阿里云镜像
maven {
url = uri("https://maven.aliyun.com/repository/jcenter")
}
}
dependencies {
// 声明对Kotlin标准库的依赖关系
implementation(kotlin("stdlib"))
}
接下来就可以通过命令行工具运行代码了,由于我是macos,所以使用gradlew
./gradlew run
这段命令会自动安装依赖并编译运行
3.4 引入依赖
上面的操作只是最基本的操作,如果我们要在代码中引入外部依赖怎么办。我们在src/main/kotlin下创建文件Cancel.kt
,代码如下:
package sampleDemo
import kotlinx.coroutines.*
fun main() = runBlocking<Unit> {
val job = launch {
try {
repeat(1000) { i ->
println("job: I'm sleeping $i ...")
delay(500L)
}
} finally {
println("job: I'm running finally")
withContext(NonCancellable) {
delay(1000L)
println("job: And I've just delayed for 1 sec because I'm non-cancellable")
}
}
}
delay(1300L) // 延迟一段时间
println("main: I'm tired of waiting!")
// job.cancel() // 取消该作业
// job.join() // 等待作业执行结束
job.cancelAndJoin () // 合并cancel和cancelAndJoin
println("main: Now I can quit.")
}
这段代码其实是取消协程的执行,但其中依赖了kotlinx.coroutines这个库,直接运行会报错,此时就需要在build.gradle.kts中新增一些配置:
dependencies {
// 声明对Kotlin标准库的依赖关系
implementation(kotlin("stdlib"))
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.5")
}
之后再运行run命令就不会报错了
3.5 切换代码目录
在上面的代码中,我们把Kotlin代码放入src/main/kotlin路径下,因为Gradle默认该路径下存放Kotlin/Java代码文件,我们也可以通过设置改变代码目录。在build.gradle.kts中添加如下配置
sourceSets {
main {
java {
srcDirs("src")
}
}
}
此时进行编译是可以运行的,因为src/main/kotlin在src目录下,我们在src下新建文件OutSide.kt
package outSideDemo
fun main(args: Array<String>) {
println("I'm outside")
}
将build.gradle.kts中的mainClassName 设置为 outSideDemo.OutSideKt
,再次运行编译
如果我们不设置sourceSets,那么mainClassName 设置为 outSideDemo.OutSideKt
时,Gradle依然会到src/main/kotlin目录下查找文件,自然会报错。
4.参考文档