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目錄下查找文件,自然會報錯。