返回 登录
1

深入解析构建 Kotlin 项目实践

阅读2778

编者按:今年的 Google I/O 大会上,Google 宣布 Kotlin 成为 Android 开发的官方语言,一时之间,究竟使用 Java 还是 Kotlin 开发,也成为众多开发者热议的话题。近日,Android 大神 Jake Wharton 发推文称已入职 Google,正式加入 Google 的 Android 框架团队,从事 Kotlin 方面的工作。这无疑为 Google Android Framework Team 增添一大助力,同时也吸引着更多的开发者加入 Kotlin 开发团队。

下面本文将深入解析构建 Kotlin 项目实践,阐明如何使用 Gradle、Maven 和 Ant 来构建 Kotlin 代码的项目,也涵盖了如何构建 Kotlin 的 Android 应用,希望可以帮助大家更好地学习了解 Kotlin。

本章节选自图书《Kotlin实战》的附录 A 部分内容。

用 Gradle 构建 Kotlin 代码的项目

构建 Kotlin 项目的推荐系统是 Gradle。Gradle 是 Android 项目的标准构建系统,它还支持可以使用 Kotlin 的所有其他类型的项目。Gradle 具有灵活的项目模型,因为支持增量构建、长期构建过程(Gradle 守护进程)和其他高级技术,因此可以提供出色的构建性能。

Gradle 团队正在努力支持用 Kotlin 编写 Gradle 构建脚本,这将允许使用相同的语言编写应用程序及其构建脚本。在本文的编写过程中,这项工作仍在进行。可以在 https://github.com/gradle/gradle-script-kotlin 中找到有关的更多信息。在本书中,我们使用 Groovy 语法来编写 Gradle 构建脚本。

构建 Kotlin 项目的标准 Gradle 构建脚本如下所示 :

脚本在以下位置查找 Kotlin 源文件:

  • 代码源文件位置 :src/main/java 和 src/main/kotlin
  • 测试源文件位置 :src/test/java 和 src/test/kotlin

在大多数情况下,推荐将 Kotlin 和 Java 源文件放在同一目录中。尤其是当你把 Kotlin 引入现有项目时,使用单个源文件目录可以减少 Java 文件转换为 Kotlin 的阻力。

如果你使用了 Kotlin 反射,则需要另外添加一个依赖关系:Kotlin 反射库。为此,请在 Gradle 构建脚本的 dependencies 中添加以下内容 :

compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"

用 Gradle 来构建 Kotlin Android 应用

和普通的 Java 应用相比,Android 应用使用了不同的构建过程,所以需要使用 不同的 Gradle 插件来构建。不是添加 apply plugin: ‘kotlin’,需要把下面 的代码添加到构建脚本中 :

apply plugin: 'kotlin-android'

剩下的设置和其他非Android 应用的设置一样。

如果你喜欢把 Kotlin 源代码放在特定目录下(如src/main/kotlin),则需要注册它们,以便 Android Studio 识别它们为源目录。可以用以下代码段来实现:

android {
...

sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
}

构建需要处理注解的项目

许多 Java 框架,特别是在 Android 开发中使用框架,都依赖注解处理在编译时 生成代码。要在 Kotlin 中使用这些框架,需要在构建脚本中启用 Kotlin 注解处理。 可以通过添加下面的代码来实现 :

apply plugin: 'kotlin-kapt'

如果你试图引入 Kotlin 到现有的一个使用注解处理的 Java 项目中,那么需要删除 apt 工具的现有配置。Kotlin 注解处理工具包含了 Java 和 Kotlin 类的处理,如果同时有两个单独的注解处理工具会很多余。可以使用 kapt 依赖配置来配置注解处理所需的依赖关系:

dependencies {
compile 'com.google.dagger:dagger:2.4'
kapt 'com.google.dagger:dagger-compiler:2.4'
}

如果你对 androidTest 或 test 使用注解处理器,则对应的 kapt 配置应该分别为 kaptAndroidTest 和 kaptTest。

使用 Maven 来构建 Kotlin 项目

如果你喜欢使用 Maven 来构建项目,Kotlin 也是支持的。最简便的方式是使用 org.jetbrains.kotlin:kotlin-archetype-jvm 原型来创建 Kotlin 的 Maven 项 目。对于现有的 Maven 项 目,可以简单地通过在项目的 Kotlin IntelliJ IDEA 插件中选择 Tools > Kotlin > Configure Kotlin 添加对 Kotlin 的支持。

要手动给 Kotlin 项目添加 Maven 的支持,需要执行以下步骤 :

  1. 在 Kotlin 的标准库上添加依赖 (group ID :org.jetbrains.kotlin,artifact ID :kotlin-stdlib)。
  2. 添 加 Kotlin 的 Maven 的 插 件 (group ID :org.jetbrains.kotlin, artifact ID :kotlin-maven-plugin),并配置它在 compile 和 test- compile 阶段执行。
  3. 如果你喜欢把 Kotlin 代码和 Java 的源代码根目录分开,配置源文件目录。

由于篇幅的关系,在这里我们就不展示完整的 pom.xml 示例了,可以在在线文档中找到它们,网址为 :https://kotlinlang.org/docs/reference/using-maven.html

在混合的 Java / Kotlin 项目中,需要配置 Kotlin 插件,以便它在 Java 插件之前运行。这个很有必要。因为 Kotlin 插件可以解析 Java 源代码,而 Java 插件只能读取 .class 文件。因此,需要在 Java 插件运行之前将 Kotlin 文件编译为 .class。可以在
http://mng.bz/73od 上找到如何配置的示例。

用 Ant 来构建 Kotlin 代码

Kotlin 提供了两种任务来使用 Ant 构建项目 :<kotlinc> 任务用于编译纯 Kotlin 的模块,而 <withKotlin> 作为 <javac> 的扩展用于构建混合的 Kotlin/Java 模块。这里是使用 <kotlinc> 的一个最小示例 :

Ant 任务<kotlinc>会自动添加标准库的依赖,所以你不必在配置时添加额外的参数。它也支持打包编译的 .class 文件到一个 jar 文件。这里是一个使用<withKotlin>任务来构建一个混合的 Java / Kotlin 模块的示例:

<kotlinc>不同的是,<withKotlin>并不支持自动打包编译的类,所以这个示例中单独使用了<jar>任务来打包。

图书详情

《Kotlin 实战》

首著席卷而来 Android 界 Swift Java 全兼容
谷歌官方头牌 移动开发巨变

《Kotlin 实战》将从语言的基本特性开始,逐渐覆盖其更多的高级特性,尤其注重讲解如何将 Koltin 集成到已有 Java 工程实践及其背后的原理。本书分为两个部分。第一部分讲解如何开始使用 Kotlin 现有的库和API,包括基本语法、扩展函数和扩展属性、数据类和伴生对象、lambda 表达式,以及数据类型系统(着重讲解了可空性和集合的概念)。第二部分教你如何使用 Kotlin 构建自己的 API,以及一些深层次特性——约定和委托属性、高阶函数、泛型、注解和反射,以及领域特定语言的构建。《Kotlin 实战》适合广大移动开发者及入门学习者,尤其是紧跟主流趋势的前沿探索者。

作者:本书作者为 JetBrains 的 Kotlin 核心开发者!Dmitry Jemerov 是Kotlin 最早的贡献者之⼀,创建了最初版本的 Kotlin JVM 字节码⽣成器,并且还在世界各地的活动上做了很多关于 Kotlin 的演示。⽬前他带领了进⾏ Kotlin IntelliJ IDEA 插件开发的团队。

Svetlana Isakova 从事编译器类型推导和重载解析⼦系统的⼯作。现在她是⼀名技术布道者,在各种会议上进⾏ Kotlin 相关讨论并从事 Kotlin 在线课程的相关⼯作。

译者:覃宇,ThoughtWorks 高级咨询师,10余年移动应用开发经验,Android 技术专家,曾为AOSP贡献过测试用例;目前专注于移动应用的架构设计、自动化测试以及持续交付。

罗丽,高级软件工程师,移动技术开发顾问,拥有丰富的软件开发经验, 熟悉React Native,Android,iOS等多种开发技术。目前任职于ThoughtWorks海外事业部,曾在多个大型移动应用项目中担任技术顾问。

李思阳,ThoughtWorks咨询师,移动开发工程师。熟悉Android、Mobile Web相关技术,有着丰富的移动应用开发经验,在移动应用体验和兼容性相关领域有独特的见解;长期关注Android领域相关技术动向。

蒋扬海,ThoughtWorks移动开发咨询师,深耕Android开发多年,应用开发经验丰富,对Android开发领域的技术有广泛的涉猎,对Android技术动向有着敏锐的洞察力。

点击参与图书赠书活动http://mp.weixin.qq.com/s/NQkaOBO3040obRlSPVMF4Q

评论