使用JPMS和ServiceLoader运行Javalin时出现NoClassDefFoundError异常
问题描述
结合JPMS(Java平台模块系统)与ServiceLoader运行Javalin应用时,抛出NoClassDefFoundError: kotlin/NoWhenBranchMatchedException异常,但以下两种方式运行相同代码可正常工作:
- 不使用JPMS和ServiceLoader:将该Javalin应用不作为JPMS模块运行,且不通过ServiceLoader解析依赖,运行无异常。
- 控制台应用:运行作为标准JPMS模块并使用ServiceLoader解析依赖的控制台应用,可正常工作。
问题复现步骤
- 克隆项目main分支
- 在项目根目录执行命令运行API:
# Windows .\gradlew.bat :api:run # Linux ./gradlew :api:run
执行后出现如下错误:
> Task :api:run FAILED [main] INFO org.example.api.WebAPI - Hello World from WebAPI, yay :-) Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/NoWhenBranchMatchedException at io.javalin@4.6.4/io.javalin.core.JavalinConfig$Inner.<init>(JavalinConfig.java:77) at io.javalin@4.6.4/io.javalin.core.JavalinConfig.<init>(JavalinConfig.java:67) at io.javalin@4.6.4/io.javalin.Javalin.<init>(Javalin.java:54) at io.javalin@4.6.4/io.javalin.Javalin.create(Javalin.java:91) at io.javalin@4.6.4/io.javalin.Javalin.create(Javalin.java:78) at org.example.api/org.example.api.WebAPI.main(WebAPI.java:24) Caused by: java.lang.ClassNotFoundException: kotlin.NoWhenBranchMatchedException 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:520) ... 6 more FAILURE: Build failed with an exception.
可行的运行方式
- 不使用JPMS和ServiceLoader:切换到项目的no-jpms-and-serviceloader分支,执行以下命令可成功运行API:
# Windows .\gradlew.bat :api:run # Linux ./gradlew :api:run
- 控制台应用:在任意分支中执行以下命令运行控制台应用,均可正常工作:
# Windows .\gradlew.bat :client:run # Linux ./gradlew :client:run
内容的提问来源于stack exchange,提问作者baumgarb
相关产品推荐
相关产品推荐

