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 初始化目录,运行结果如下:

android studio Kotlin 编译速度 kotlin编译过程_Kotlin


其中有两步需要选择,第一次是选择项目类型,四个选项言简意赅,这里我们选择basic,后续有需要再通过配置文件进行配置。第二次是选择配置文件类型,因为我们使用Kotlin进行开发,所以这里就选Kotlin,你也可以在初始化时通过gradle init --dsl kotlin来设置该选项。

初始化完成后的目录结构应该是这样的:

android studio Kotlin 编译速度 kotlin编译过程_Kotlin_02


需要我们关注的是:

  • build.gradle.kts:Gradle配置文件
  • gradlew:用于在Linux或Mac系统的命令行中执行gradle命令
  • gradlew.bat:用于在Windows系统的命令行中执行gradle命令

3.2 创建Kotlin文件

我们在basic_demo的根目录下创建路径src/main/kotlin,随后在kotlin目录下创建Kotlin文件HelloWorld.kt

android studio Kotlin 编译速度 kotlin编译过程_Gradle_03


至于为什么要把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

这段命令会自动安装依赖并编译运行

android studio Kotlin 编译速度 kotlin编译过程_ide_04

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命令就不会报错了

android studio Kotlin 编译速度 kotlin编译过程_Gradle_05

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,再次运行编译

android studio Kotlin 编译速度 kotlin编译过程_ide_06


如果我们不设置sourceSets,那么mainClassName 设置为 outSideDemo.OutSideKt时,Gradle依然会到src/main/kotlin目录下查找文件,自然会报错。

4.参考文档

Gradle官方指引