官术网_书友最值得收藏!

2.2 在Java構(gòu)建中添加對(duì)Kotlin的支持

如果我們想把Java項(xiàng)目重構(gòu)為Kotlin項(xiàng)目,第一個(gè)必須做出的改變就是讓自己有能力在代碼庫(kù)中編寫Kotlin代碼。令人高興的是,Kotlin的構(gòu)建工具和IDE讓這一切變得非常簡(jiǎn)單。在我們的Gradle構(gòu)建配置中,只需增加幾行,就可以讓Kotlin和Java一樣進(jìn)行編譯。當(dāng)我們重新同步構(gòu)建文件時(shí),IntelliJ就會(huì)接收該配置,讓我們幾乎能夠無(wú)縫地在兩種語(yǔ)言之間進(jìn)行導(dǎo)航、自動(dòng)完成代碼和重構(gòu)。

要將Kotlin添加到Gradle構(gòu)建中,需要添加Kotlin插件。Kotlin所支持的每一類編譯目標(biāo)(JVM、JavaScript和本地代碼)都有不同的插件以及用于構(gòu)建多平臺(tái)項(xiàng)目的插件。因?yàn)槲覀円瓿傻氖荍ava項(xiàng)目,所以先忽略其他平臺(tái),使用Kotlin的JVM插件。

我們還需要將Kotlin標(biāo)準(zhǔn)庫(kù)添加到依賴項(xiàng)中,并指定輸出字節(jié)碼所支持的最小JVM版本。我們的項(xiàng)目以JDK 11為目標(biāo)(在撰寫本書時(shí),它是最新的LTS版本)。在撰寫本書時(shí),Kotlin編譯器可以生成與JDK 1.6或JDK 1.8兼容的字節(jié)碼。JDK 1.8的字節(jié)碼效率更高,在JDK 11上運(yùn)行良好,所以我們將選擇它。

Kotlin版本

Kotlin語(yǔ)言和標(biāo)準(zhǔn)庫(kù)仍在不斷完善,但JetBrains的策略是提供一個(gè)清晰的遷移路徑。我們開(kāi)始撰寫本書時(shí),Kotlin的版本是1.3;我們完成本書的時(shí)候,1.5版本剛剛發(fā)布,示例代碼中使用的一些標(biāo)準(zhǔn)API已經(jīng)被廢除了,我們沒(méi)有將它們遷移到其替代品上,這樣代碼就能在Kotlin 1.4和Kotlin 1.5上運(yùn)行了。

以下是修改前的build.gradle的相關(guān)部分:

在添加了Kotlin插件后,構(gòu)建文件看起來(lái)像下面這樣:

鑒于這些變化,我們重新運(yùn)行構(gòu)建文件,可以看到構(gòu)建仍然有效!

如果在IntelliJ中重新同步Gradle項(xiàng)目(這可能在保存時(shí)自動(dòng)發(fā)生),我們可以在IDE中運(yùn)行測(cè)試和程序。

測(cè)試仍然可以通過(guò),所以我們沒(méi)有破壞任何東西,但也無(wú)法證明我們可以在項(xiàng)目中使用Kotlin。我們通過(guò)編寫一個(gè)“hello world”程序來(lái)測(cè)試一下。在Java源代碼樹(shù)的根級(jí)包src/main/java中創(chuàng)建一個(gè)文件HelloWorld.kt

在何處放置Kotlin代碼

Kotlin構(gòu)建插件增加了額外的源代碼根目錄,即src/main/kotlinsrc/test/kotlin,并編譯其所有子目錄中發(fā)現(xiàn)的Kotlin源代碼文件。

它也會(huì)編譯在Java源代碼樹(shù)中發(fā)現(xiàn)的Kotlin源代碼,特別是src/main/javasrc/test/java。雖然你可以按語(yǔ)言來(lái)分離源文件,把Java文件放在java目錄下,把Kotlin文件放在kotlin目錄下,但實(shí)際上我們并不反感將Java文件和Kotlin文件放在一起。能夠在一個(gè)目錄中看到相應(yīng)包的所有源代碼也挺好,不用在文件系統(tǒng)中四處尋找。不過(guò),為了做到這一點(diǎn),我們把Kotlin的源代碼放在反映包結(jié)構(gòu)的目錄中,而不是利用Kotlin的能力,將映射到不同包的多個(gè)文件放在單個(gè)目錄下。

同樣,雖然Kotlin允許在一個(gè)類中定義多個(gè)公共類,但當(dāng)我們?cè)谝粋€(gè)項(xiàng)目中混用Java和Kotlin時(shí),為了保持一致性,我們傾向于堅(jiān)持每個(gè)Kotlin文件只包含一個(gè)類。

可以通過(guò)在IDE中單擊fun main()函數(shù)左邊的綠色箭頭來(lái)啟動(dòng)程序。

我們也可以通過(guò)java命令行來(lái)執(zhí)行構(gòu)建文件并啟動(dòng)程序。編譯名為HelloWorld.kt的源文件會(huì)創(chuàng)建一個(gè)名為HelloWorldKt的Java類文件。我們將在后面詳細(xì)研究Kotlin源代碼如何被翻譯成Java類文件,但現(xiàn)在,我們可以用java命令來(lái)運(yùn)行程序,就像下面這樣:

成功了!

我們刪除HelloWorld.kt——它的使命已經(jīng)完成了——提交并推送。

現(xiàn)在,我們可以選擇在項(xiàng)目中使用Kotlin了,本章前面已經(jīng)給出了一些關(guān)于從哪里起步的指南。

其他構(gòu)建系統(tǒng)

我們已經(jīng)展示了在Gradle構(gòu)建中添加Kotlin支持所需的改動(dòng),但你也可以按照Kotlin文檔(https://oreil.ly/bWi9n)工具部分提供的說(shuō)明,使用Maven或Ant。文檔中也給出了如何使用命令行編譯器kotlinc的說(shuō)明。

如果你用的是Gradle,也可以選擇使用Kotlin作為構(gòu)建定義語(yǔ)言,而不是傳統(tǒng)的Groovy。這樣做的好處是借助強(qiáng)類型提供更好的工具支持,但代價(jià)是必須將StackOverflow中的歷史回答翻譯成一種新的語(yǔ)言。

由于我們是Java和Kotlin開(kāi)發(fā)者,而不是Java和Groovy開(kāi)發(fā)者,因此選擇用Kotlin DSL來(lái)啟動(dòng)新項(xiàng)目,但我們覺(jué)得沒(méi)有必要將現(xiàn)有的Groovy構(gòu)建轉(zhuǎn)換為Kotlin,至少不需要立即轉(zhuǎn)換。就像生產(chǎn)代碼中的Java和Kotlin一樣,我們可以在構(gòu)建中混合使用Kotlin和Groovy,所以這是一個(gè)可以慢慢進(jìn)行的轉(zhuǎn)換。我們不建議你把構(gòu)建文件從Groovy轉(zhuǎn)換為Kotlin作為第一步,當(dāng)然也不要指望我們寫一本關(guān)于如何從Groovy到Kotlin Gradle的書籍。

主站蜘蛛池模板: 桐乡市| 收藏| 林甸县| 孟村| 金湖县| 凤山县| 双江| 大石桥市| 改则县| 乌什县| 江华| 昌平区| 佛山市| 彭州市| 舟曲县| 太保市| 安平县| 文昌市| 从化市| 石狮市| 重庆市| 赫章县| 织金县| 湖北省| 始兴县| 凌源市| 札达县| 贵溪市| 全椒县| 双城市| 黄陵县| 巩义市| 崇信县| 龙山县| 麻阳| 天峨县| 沧州市| 嫩江县| 罗城| 江城| 永泰县|