Adding Ktor to an existing Maven project
In this tutorial, we'll show you how to integrate Ktor into the existing Maven project.
Prerequisites
Before starting this tutorial, do the following:
Make sure the Kotlin plugin is installed and enabled.
Make sure the Maven and Maven Extension plugins are installed and enabled.
Create a new Maven project
To create a new Maven project, open IntelliJ IDEA, and follow the steps below:
On the Welcome screen, click New Project.
Otherwise, from the main menu, select
.In the New Project wizard, choose Kotlin from the list on the left and specify the following settings:
Specify a project's Name.
Set Project Template to Application.
Select Maven as a build system.
Choose the Project JDK from the list.
Click Next.
On the next wizard page, leave the default settings and click Finish.
Wait until IntelliJ IDEA creates and builds a project.
Add Ktor dependencies
After creating an empty project, we are ready to examine a Maven configuration file and add Ktor dependencies to it:
Open the pom.xml file. It should look something like this:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>mainModule</artifactId> <groupId>me.jetbrains</groupId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>mainModule</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <kotlin.code.style>official</kotlin.code.style> <kotlin.compiler.jvmTarget>13</kotlin.compiler.jvmTarget> </properties> <repositories> <repository> <id>mavenCentral</id> <url>https://repo1.maven.org/maven2/</url> </repository> </repositories> <build> <sourceDirectory>src/main/kotlin</sourceDirectory> <testSourceDirectory>src/test/kotlin</testSourceDirectory> <plugins> <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>1.5.31</version> <executions> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> <execution> <id>test-compile</id> <phase>test-compile</phase> <goals> <goal>test-compile</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-test-junit</artifactId> <version>1.5.31</version> <scope>test</scope> </dependency> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib-jdk8</artifactId> <version>1.5.31</version> </dependency> </dependencies> </project>This configuration file includes the kotlin-maven-plugin for compiling Kotlin sources. Moreover, it declares the Maven Central repository in the repositories block. Since Ktor dependencies are stored in Maven Central, we don't need to change anything here.
To create a simple Ktor application, we need to add at least the following dependencies:
ktor-server-core
: contains core Ktor functionality.A dependency for an engine (for example,
ktor-server-netty
).Logback artifacts for logging.
The
properties
anddependencies
blocks might look as follows:<properties> <ktor.version>1.6.8</ktor.version> <logback_version>1.2.5</logback_version> </properties> <dependencies> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-server-core</artifactId> <version>${ktor.version}</version> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-server-netty</artifactId> <version>${ktor.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback_version}</version> </dependency> </dependencies>Note that other engines and plugins that extend Ktor functionality might required additional dependencies. You can learn more from corresponding topics.
The resulting pom.xml file should look as shown below.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>mainModule</artifactId> <groupId>me.jetbrains</groupId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>mainModule</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <kotlin.code.style>official</kotlin.code.style> <kotlin.compiler.jvmTarget>13</kotlin.compiler.jvmTarget> <ktor.version>1.6.8</ktor.version> <logback_version>1.2.5</logback_version> <main.class>io.ktor.server.netty.EngineMain</main.class> </properties> <repositories> <repository> <id>mavenCentral</id> <url>https://repo1.maven.org/maven2/</url> </repository> </repositories> <build> <sourceDirectory>src/main/kotlin</sourceDirectory> <testSourceDirectory>src/test/kotlin</testSourceDirectory> <plugins> <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>1.5.31</version> <executions> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> <execution> <id>test-compile</id> <phase>test-compile</phase> <goals> <goal>test-compile</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-test-junit</artifactId> <version>1.5.31</version> <scope>test</scope> </dependency> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib-jdk8</artifactId> <version>1.5.31</version> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-server-core</artifactId> <version>${ktor.version}</version> </dependency> <dependency> <groupId>io.ktor</groupId> <artifactId>ktor-server-netty</artifactId> <version>${ktor.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback_version}</version> </dependency> </dependencies> </project>
Create a server
Now we a ready to add some code for creating a Ktor server and running our application:
Create a com.example package within the src/main/kotlin folder.
In the com.example package, add an empty Application.kt file.
Since Ktor supports two approaches for creating a server, you can choose one of the following:
Create a server using embeddedServer
Add the following code to Application.kt to use the
embeddedServer
function for starting a Ktor server:package com.example import io.ktor.application.* import io.ktor.response.* import io.ktor.routing.* import io.ktor.server.engine.* import io.ktor.server.netty.* fun main() { embeddedServer(Netty, port = 8080) { routing { get("/") { call.respondText("Hello, world!") } } }.start(wait = true) }
Create a server using EngineMain
Add the following code to Application.kt to use
EngineMain
for starting a Ktor server:package com.example import io.ktor.application.* import io.ktor.response.* import io.ktor.routing.* fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args) fun Application.module(testing: Boolean = false) { routing { get("/") { call.respondText("Hello, world!") } } }The
Application.module
function is a module loaded by the server. Modules to load should be specified in the application.conf file, which will be created in the next step.Create the application.conf file in the src/main/resources folder and copy the following configuration:
ktor { deployment { port = 8080 } application { modules = [ com.example.ApplicationKt.module ] } }This file specifies a fully qualified name of the
Application.module
module to load and sets a listening port to8080
.
Run an application
Now we can run our Ktor application:
To run the application, click the gutter icon next to the
main
function and choose Run 'ApplicationKt'.Wait until Intellij IDEA runs the application. The Run tool window should show the following message:
[main] INFO Application - Responding at http://0.0.0.0:8080This means that the server is ready to accept requests at the http://0.0.0.0:8080 address. You can click this link to open the application in a default browser: