入門-使用Gradle編譯運行Kotlin代碼

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.參考文檔

Gradle官方指引

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章