Engines
To run a Ktor server application, you need to create and configure a server first. Server configuration can include different settings: a server engine, various engine-specific options, host and port values, and so on. The following engines are supported:
- Netty
- Jetty
- Tomcat
- CIO (Coroutine-based I/O)
In addition to the engines mentioned above, Ktor provides a special engine type TestEngine for testing application logic. You can learn more about it from Testing.
Add Dependencies
Before using the desired engine, you need to add a corresponding dependency to your build.gradle or pom.xml file:
ktor-server-nettyktor-server-jettyktor-server-tomcatktor-server-cio
Below are examples of adding a dependency for Netty:

Gradle (Groovy)
Gradle (Kotlin)
Maven

1. implementation "io.ktor:ktor-server-netty:$ktor_version"
tip
For testing, you need to add the
ktor-server-test-hostdependency. There is also thektor-server-servletdependency that allows you to run an application in a servlet container like Jetty or Tomcat. Learn more at Containers.
Configure Engines
A Ktor server application can be run in two ways:
- embeddedServer is a simple way to configure server parameters in code and quickly run an application.
- EngineMain provides more flexibility to configure a server. You can specify server parameters in an
application.conffile and change a configuration without recompiling your application. Moreover, you can run your application from a command line and override the required server parameters by passing corresponding command-line arguments.
You can learn more about configuring Ktor from Configurations.
embeddedServer
The embeddedServer function accepts an engine factory used to create an engine of a specific type. In the example below, we pass the Netty factory to run a server with the Netty engine and listen on the 8000 port:
1. import io.ktor.server.netty.*
3. fun main() {
4. embeddedServer(Netty, port = 8000) {
5. routing {
6. get ("/") {
7. call.respondText("Hello, world!")
8. }
9. }
10. }.start(wait = true)
11. }
EngineMain
EngineMain represents an engine for running a server. You can use the following engines:
io.ktor.server.netty.EngineMainio.ktor.server.jetty.EngineMainio.ktor.server.tomcat.EngineMainio.ktor.server.cio.EngineMain
The EngineMain.main function is used to start a server with the selected engine and can accept command-line server parameters. In the example below, we start a server from the application’s main function:
1. fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)
3. fun Application.module(testing: Boolean = false) {
4. routing {
5. get("/") {
6. call.respondText("Hello, world!")
7. }
8. }
9. }
If you need to start a server using a build system task, you need to configure the required EngineMain as the main class:

Gradle (Groovy)
Gradle (Kotlin)
Maven

1. mainClassName = "io.ktor.server.netty.EngineMain"
