Setting up a Gradle Build

预计阅读时间:9分钟

在本指南中,我们将向您展示如何创建build.gradle文件以及如何配置它以支持Ktor.

目录:

Basic Kotlin build.gradle file (without Ktor)

首先,您需要一个包含Kotlin的基本build.gradle文件. 您可以使用任何文本编辑器创建它,也可以按照IntelliJ指南使用IntelliJ来创建它.

初始文件如下所示:

build.gradle
group 'Example'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.3.60'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'java'
apply plugin: 'kotlin'

sourceCompatibility = 1.8

repositories {
    jcenter()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

Add Ktor dependencies and configure build settings

Ktor工件位于Bintray上的特定存储库中. 其核心对依赖kotlinx.coroutines能上找到库jcenter .

您必须将两者都添加到build.gradle文件中的repositories块中:

jcenter()

您必须在每个Ktor工件引用中指定该版本,并且为了避免重复,您可以在buildscript块(或gradle.properties文件)的一个额外属性中指定该版本,以供以后使用:

ext.ktor_version = '1.2.6'

现在,您必须添加ktor-server-core工件,并引用您指定的ktor_version

compile "io.ktor:ktor-server-core:$ktor_version"

在groovy中,有单引号字符串(而不是字符)和双引号字符串,为了能够像版本一样插值变量,您必须使用双引号字符串.

您需要告诉Kotlin编译器生成与Java 8兼容的字节码:

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

Choose your engine and configure it

Ktor可以在许多环境中运行,例如Netty,Jetty或任何其他Servlet兼容的应用程序容器(例如Tomcat).

本示例说明如何使用Netty配置Ktor. 对于其他引擎,请参阅工件以获取可用工件的列表.

您将使用创建的ktor_version属性为ktor-server-netty添加依赖ktor-server-netty . 此模块提供Netty Web服务器以及在其之上运行Ktor应用程序所需的所有代码:

compile "io.ktor:ktor-server-netty:$ktor_version"

Final build.gradle (with Ktor)

When you are done, the build.gradle file should look like this:

build.gradle
group 'Example'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.3.60'
    ext.ktor_version = '1.2.6'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'java'
apply plugin: 'kotlin'

sourceCompatibility = 1.8
compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

kotlin {
    experimental {
        coroutines "enable"
    }
}

repositories {
    jcenter()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    compile "io.ktor:ktor-server-netty:$ktor_version"
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

现在,您可以运行Gradle(如果使用包装器,则可以使用gradle./gradlew )来获取依赖项并验证所有设置是否正确.

本教程将指导您从最基本的设置到完整的功能设置,您可以使用它们来开始开发应用程序.

IntelliJ: Prerequisites

  1. 最新版本的IntelliJ IDEA
  2. Kotlin和Gradle插件已启用(默认情况下应启用.)

您可以在IntelliJ IDEA的主菜单中进行检查:

  • Windows: File -> Settings -> Plugins
  • Mac: IntelliJ IDEA -> Settings -> Plugins

IntelliJ: Start a Project

  1. File -> New -> Project:

    Ktor IntelliJ: File New Project

  2. 选择Gradle,然后在其他库和框架下,选中Java和Kotlin(Java). 确认Project SDK已完成,然后单击Next

    Ktor IntelliJ: Gradle Kotlin JVM

  3. 输入一个GroupId: Example和ArtifactId: Example ,然后单击下一步:

    Ktor IntelliJ: GroupId

  4. 完整的项目名称: Example和项目位置: a/path/on/your/filesystem ,然后单击Finish

    Ktor IntelliJ: Project Location Name

  5. 等待几秒钟让Gradle运行,您应该看到一个类似以下的项目结构(以及其他一些文件和目录):

    Ktor IntelliJ: Project Structure

  6. 使用工件和资源库更新build.gradle文件,以使这些类可用:

    • build.gradledependencies块中包含compile("io.ktor:ktor-server-netty:$ktor_version")
    • 在您的repositories块中包含jcenter()

    Ktor IntelliJ: Build Gradle

有关设置build.gradle文件的详细指导,请查看Gradle入门部分.

显示自动导入选项时(可能在右下角),单击允许自动导入.

IntelliJ: Gradle Setup

本节假定您具有Gradle的一些基本知识. 如果您从未使用过Gradle,则gradle.org提供了一些指南来帮助您入门.

您可以使用Gradle设置一个简单的Ktor应用程序,如下所示:

Ktor Build with Gradle

文字版本:

Groovy
// build.gradle

group 'Example'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.3.60'
    ext.ktor_version = '1.2.6'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'application'

mainClassName = 'MainKt'

sourceCompatibility = 1.8
compileKotlin { kotlinOptions.jvmTarget = "1.8" }
compileTestKotlin { kotlinOptions.jvmTarget = "1.8" }

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    compile "io.ktor:ktor-server-netty:$ktor_version"
    compile "ch.qos.logback:logback-classic:1.2.3"
    testCompile group: 'junit', name: 'junit', version: '4.12'
}
Kotlin
// build.gradle.kts

import org.jetbrains.kotlin.gradle.dsl.Coroutines
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

group = "Example"
version = "1.0-SNAPSHOT"

val ktor_version = "1.2.6"

plugins {
    application
    kotlin("jvm") version "1.3.60"
}

repositories {
    mavenCentral()
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_8
}

tasks.withType<KotlinCompile>().all {
    kotlinOptions.jvmTarget = "1.8"
}

application {
    mainClassName = "MainKt"
}

dependencies {
    compile(kotlin("stdlib-jdk8"))
    compile("io.ktor:ktor-server-netty:$ktor_version")
    compile("ch.qos.logback:logback-classic:1.2.3")
    testCompile(group = "junit", name = "junit", version = "4.12")
}

由于Ktor尚未为1.0,所以我们有自定义的Maven存储库,用于分发我们的早期预览工件. 您必须建立如下所示的几个存储库,以便您的工具可以找到Ktor工件和依赖项.

当然,不要忘记包含实际的工件! 对于我们的快速入门,我们使用ktor-server-netty工件. 其中包括Ktor的核心,netty和ktor-netty连接器作为传递依赖项. 当然,您可以包括所需的任何其他依赖项.

由于Ktor被设计为模块化的,因此您将需要其他工件和特定功能的其他存储库. 您可以在特定功能文档中找到每个功能所需的工件(以及所需的存储库).

IntelliJ: Create the App

选择src/main/kotlin目录并创建一个新包. 我们称它为blog .

选择该目录并在其下创建一个名为BlogApp的新kotlin文件.

Ktor IntelliJ: Create Kotlin File

Ktor IntelliJ: Create Kotlin File Name

复制并粘贴应用程序的最基本设置,如下所示:

BlogApp.kt
package blog

import io.ktor.application.*
import io.ktor.http.*
import io.ktor.response.*
import io.ktor.routing.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*

fun main(args: Array<String>) {
    embeddedServer(Netty, 8080) {
        routing {
            get("/") {
                call.respondText("My Example Blog", ContentType.Text.Html)
            }
        }
    }.start(wait = true)
}

Ktor IntelliJ: Program

现在您可以运行' blog.BlogAppKt '. 您可以通过按带有 符号并选择Debug 'blog.BlogAppKt'

Ktor IntelliJ: Program Run

这还将在IntelliJ的右上部分中创建一个运行配置,这将允许再次轻松运行此配置:

Ktor IntelliJ: Program Run Config

这将启动Netty Web服务器. 在浏览器中输入URL:localhost:8080并且您应该看到示例博客页面.

Ktor IntelliJ: Website

IntelliJ: Improve the app with the Application object

上面的设置有很多嵌套块,因此不适合开始向您的应用添加功能. 我们可以通过使用Application对象并从main函数中的EmbeddedServer调用中引用它来改进它.

将您的BlogApp.kt中的代码更改为以下内容以尝试此操作:

BlogApp.kt
package blog

import io.ktor.application.*
import io.ktor.features.*
import io.ktor.http.*
import io.ktor.response.*
import io.ktor.routing.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*

fun Application.module() {
    install(DefaultHeaders)
    install(CallLogging)
    install(Routing) {
        get("/") {
            call.respondText("My Example Blog2", ContentType.Text.Html)
        }
    }
}

fun main(args: Array<String>) {
    embeddedServer(Netty, 8080, watchPaths = listOf("BlogAppKt"), module = Application::module).start()
}

IntelliJ: Extract out Configuration Data

尽管我们可以在主要函数EmbeddedServer调用中指定一些应用程序配置数据,但我们可以通过将其提取到单独的配置文件中来为将来的部署和更改提供更大的灵活性. 在src/main/resources目录中,我们将创建一个名为application.conf的新文本文件,其内容如下:

application.conf
ktor {
    deployment {
        port = 8080
    }

    application {
        modules = [ blog.BlogAppKt.main ]
    }
}

然后,我们从BlogApp.kt删除main函数,并将fun Application.module()更改为fun Application.main() . 但是,如果我们现在运行该应用程序,它将失败,并显示一条错误消息,例如"在包博客中找不到顶级函数'main'."我们的Application.main()函数现在是函数扩展,不符合顶层主要功能.

这需要我们指示一个新的主类,因为IntelliJ IDEA将不再能够自动找到它. 在build.gradle我们添加:

Groovy
// build.gradle

apply plugin: 'application'

//mainClassName = 'io.ktor.server.netty.DevelopmentEngine' // For versions < 1.0.0-beta-3
mainClassName = 'io.ktor.server.netty.EngineMain' // Starting with 1.0.0-beta-3
Kotlin
// build.gradle.kts

plugins {
    application
    // ...
}

application {
    mainClassName = "io.ktor.server.netty.EngineMain"
}

然后转到Run -> Edit Configurations选择blog.BlogAppKt配置并将其Main类更改为: io.ktor.server.netty.EngineMain

现在,当我们运行新配置时,该应用程序将再次启动.

Configure logging

如果要记录应用程序事件和有用的信息,可以在记录页面中进一步了解它.

by  ICOPY.SITE