I can't start embeddedServer due to this exception...
# ktor
s
I can't start embeddedServer due to this exception
Copy code
Exception in thread "main" java.lang.NoClassDefFoundError: io/ktor/utils/io/ClosedWriteChannelException
	at io.ktor.server.engine.BaseApplicationEngine.<init>(BaseApplicationEngine.kt:48)
Copy code
Exception in thread "main" java.lang.NoClassDefFoundError: io/ktor/utils/io/ClosedWriteChannelException
	at io.ktor.server.engine.BaseApplicationEngine.<init>(BaseApplicationEngine.kt:48)
	at io.ktor.server.engine.BaseApplicationEngine.<init>(BaseApplicationEngine.kt:31)
	at io.ktor.server.netty.NettyApplicationEngine.<init>(NettyApplicationEngine.kt:33)
	at io.ktor.server.netty.Netty.create(Embedded.kt:18)
	at io.ktor.server.netty.Netty.create(Embedded.kt:13)
	at io.ktor.server.engine.EmbeddedServerKt.embeddedServer(EmbeddedServer.kt:111)
	at io.ktor.server.engine.EmbeddedServerKt.embeddedServer(EmbeddedServer.kt:100)
	at io.ktor.server.engine.EmbeddedServerKt.embeddedServer(EmbeddedServer.kt:65)
	at io.ktor.server.engine.EmbeddedServerKt.embeddedServer(EmbeddedServer.kt:40)
	at io.ktor.server.engine.EmbeddedServerKt.embeddedServer$default(EmbeddedServer.kt:32)
	at se.fluen.graphql.ApplicationKt.main(Application.kt:9)
	at se.fluen.graphql.ApplicationKt.main(Application.kt)
Caused by: java.lang.ClassNotFoundException: io.ktor.utils.io.ClosedWriteChannelException
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
	... 12 more
Copy code
fun main() {
    embeddedServer(Netty, port = 8080, host = "0.0.0.0", module = Application::module)
        .start(wait = true)
}

fun Application.module() {
    configureSecurity()
    configureHTTP()
    configureMonitoring()
    configureGraphQL()
    configureRouting()
    configureRateLimit()
}
I have server-core and server-netty as dependencies as well
d
What does your build file look like?
s
Copy code
plugins {
    application
    kotlin("jvm")
    alias(libs.plugins.ktor)
    alias(libs.plugins.serialization)
    alias(libs.plugins.graphql)
}

version = libs.versions.project.get()

application {
    mainClass.set("se.fluen.graphql.ApplicationKt")

    val isDevelopment: Boolean = project.ext.has("development")
    applicationDefaultJvmArgs = listOf("-Dio.ktor.development=$isDevelopment")
}

dependencies {
    implementation(projects.core)

    implementation(libs.ktor.core)
    implementation(libs.ktor.contentNegotiation)
    implementation(libs.ktor.cors)
    implementation(libs.ktor.auth)
    implementation(libs.ktor.jwt)
    implementation(libs.ktor.logging)
    implementation(libs.ktor.netty)
    implementation(libs.ktor.client.cio)
    implementation(libs.ktor.rateLimit)
    implementation(libs.logback)
}
kotlin {
    jvmToolchain(21)
    sourceSets.main {
        kotlin.srcDir("build/generated/ksp/main/kotlin")
        languageSettings.optIn("kotlin.uuid.ExperimentalUuidApi")
    }
}
d
And your libs.versions.toml?
s
Copy code
ktor-core = { module = "io.ktor:ktor-server-core-jvm", version.ref = "ktor" }
ktor-contentNegotiation = { module = "io.ktor:ktor-server-content-negotiation-jvm", version.ref = "ktor" }
ktor-serialization = { module = "io.ktor:ktor-serialization-kotlinx-json-jvm", version.ref = "ktor" }
ktor-cors = { module = "io.ktor:ktor-server-cors-jvm", version.ref = "ktor" }
ktor-auth = { module = "io.ktor:ktor-server-auth-jvm", version.ref = "ktor" }
ktor-jwt = { module = "io.ktor:ktor-server-auth-jwt-jvm", version.ref = "ktor" }
ktor-rateLimit = { module = "io.ktor:ktor-server-rate-limit", version.ref = "ktor" }
ktor-logging = { module = "io.ktor:ktor-server-call-logging-jvm", version.ref = "ktor" }
ktor-netty = { module = "io.ktor:ktor-server-netty-jvm", version.ref = "ktor" }
ktor-test = { module = "io.ktor:ktor-server-test-host", version.ref = "ktor" }
ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
ktor-client-cio = { module = "io.ktor:ktor-client-cio", version.ref = "ktor" }
ktor-client-auth = { module = "io.ktor:ktor-client-auth", version.ref = "ktor" }
ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" }
that's the ktor stuff. version 2.3.12, kotlin 2.0.21
👍 1
d
I'm using ktor 3.0, so it might be different, but I found that calls in the
io.ktor:ktor-io:3.0.0
dependency, which is brought in from core. Look at output of
gradle server:dependencies
(assuming
server
is the name of your module.)
s
actually I'm seeing some ktor 3.0.1 dependencies in there. I assume they're coming from kotlinx rpc 0.4.0
d
Ah, version mismatch is likely the cause.
s
yeah I had a similar issue before where I got
NoSuchMethodError
on startup due to a version mismatch. sadly expedia graphql is still on ktor 2.0