Migrating from 2.2.x to 3.0.x
This guide provides instructions on how to migrate your Ktor application from the 2.2.x version to 3.0.x.
Ktor Server
ApplicationEngine, ApplicationEnvironment, and Application
Several design changes have been introduced to improve configurability and provide a more defined separation between the ApplicationEngine
, ApplicationEnvironment
and Application
instances.
Before v3.0.0, ApplicationEngine
managed ApplicationEnvironment
, which in turn managed Application
.
In the current design, however, Application
is responsible for creating, owning, and initiating both ApplicationEngine
and ApplicationEnvironment
.
This restructuring comes with the following set of breaking changes:
ApplicationEngineEnvironmentBuilder
andapplicationEngineEnvironment
classes are renamed.start()
andstop()
methods are removed fromApplicationEngineEnvironment
.embeddedServer()
returnsEmbeddedServer
instead ofApplicationEngine
.
These changes will impact existing code that relies on the previous model.
Renamed classes
Package | 2.x.x | 3.0.x |
---|---|---|
|
|
|
|
|
|
start() and stop() methods are removed from ApplicationEngineEnvironment
With the merge of AplicationEngineEnvironment
to ApplicationEnvironment
, the start()
and stop()
methods are now only accessible through ApplicationEngine
.
2.x.x | 3.0.x |
---|---|
|
|
|
|
Additionally, in the following table you can see the list of removed properties and their current corresponding ownership:
2.x.x | 3.0.x |
---|---|
|
|
|
|
|
|
|
|
|
|
The ownership changes can be illustrated through the following example:
Introduction of ServerConfigBuilder
A new entity, ServerConfigBuilder
, has been introduced for configuring server properties and replaces the previous configration mechanism of ApplicationPropertiesBuilder
. ServerConfigBuilder
is used to build instances of the ServerConfig
class, which now holds modules, paths, and environment details previously managed by ApplicationProperties
.
Additionally, in the embeddedServer()
function, the applicationProperties
attribute has been renamed to rootConfig
to reflect this new configuration approach.
Package | 2.x.x | 3.0.x |
---|---|---|
|
|
|
|
|
|
Introduction of EmbeddedServer
The class EmbeddedServer
is introduced and used to replace ApplicationEngine
as a return type of the embeddedServer()
function.
For more details about the model change, see issue KTOR-3857 on YouTrack.
Testing
withTestApplication and withApplication have been removed
The withTestApplication
and withApplication
functions, previously deprecated in the 2.0.0
release, have now been removed from the ktor-server-test-host
package.
Instead, use the testApplication
function with the existing Ktor client instance to make requests to your server and verify the results.
In the test below, the handleRequest
function is replaced with the client.get
request:
For more information, see Testing.
TestApplication module loading
TestApplication
no longer automatically loads modules from a configuration file ( e.g. application.conf
). Instead, you must explicitly load your modules within the testApplication
function or load the configuration file manually.
Explicit module loading
To explicitly load modules, use the application
function within testApplication
. This approach allows you to manually specify which modules to load, providing greater control over your test setup.
Load modules from a configuration file
If you want to load modules from a configuration file, use the environment
function to specify the configuration file for your test.
For more information on configuring the test application, see the Testing section.
CallLogging plugin package has been renamed
The CallLogging
plugin package has been renamed due to a typo.
2.x.x | 3.0.x |
---|---|
|
|
ktor-server-host-common module has been removed
Due to Application
requiring knowledge of ApplicationEngine
, the contents of ktor-server-host-common
module have been merged into ktor-server-core
, namely the io.ktor.server.engine
package.
Ensure that your dependencies are updated accordingly. In most cases, you can simply remove the ktor-server-host-common
dependency.
Locations plugin has been removed
The Locations
plugin for the Ktor server has been removed. To create type-safe routing, use the Resources plugin instead. This requires the following changes:
Replace the
io.ktor:ktor-server-locations
artifact withio.ktor:ktor-server-resources
.The
Resources
plugin depends on the Kotlin serialization plugin. To add the serialization plugin, see the kotlinx.serialization setup.Update the plugin import from
io.ktor.server.locations.*
toio.ktor.server.resources.*
.Additionally, import the
Resource
module fromio.ktor.resources
.
The following example shows how to implement these changes:
For more information on working with Resources
, refer to Type-safe routing.
Replacement of java.time in WebSockets configuration
The WebSockets plugin configuration has been updated to use Kotlin’s Duration for the pingPeriod
and timeout
properties. This replaces the previous use of java.time.Duration
for a more idiomatic Kotlin experience.
To migrate existing code to the new format, use the extension functions and properties from the kotlin.time.Duration
class to construct durations. In the following example, Duration.ofSeconds()
is replaced with Kotlin’s seconds
extension:
You can use similar Kotlin duration extensions (minutes
, hours
, etc.) as needed for other duration configurations. For more information, see the Duration documentation.
Server socket .bind() is now suspending
To support asynchronous operations in JS and WasmJS environments, the .bind()
function for server sockets in both TCPSocketBuilder
and UDPSocketBuilder
has been updated to a suspending function. This means any calls to .bind()
must now be made within a coroutine.
To migrate, ensure .bind()
is only called within a coroutine or suspending function. Here's an example of using runBlocking
:
For more information on working with sockets, see the Sockets documentation.
Session encryption method update
The encryption method offered by the Sessions
plugin has been updated to enhance security.
Specifically, the SessionTransportTransformerEncrypt
method, which previously derived the MAC from the decrypted session value, now computes it from the encrypted value.
To ensure compatibility with existing sessions, Ktor has introduced the backwardCompatibleRead
property. For current configurations, include the property in the constructor of SessionTransportTransformerEncrypt
:
For more information on session encryption in Ktor, see Sign and encrypt session data.