使用JPMS和ServiceLoader运行Javalin将导致NoClassDefFoundError: kotlin/NoWhenBranchMatchedException。但是,遵循另外两种方法的相同代码运行良好(有关详细信息,请参阅本文末尾):
复制问题的步骤
(1)克隆main分支
(2)尝试在项目的根文件夹中运行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.然而,以下两种方法工作得很好:
(3) No JPMS和ServiceLoader:更改为分支非jpms-和服务负载者,然后您可以通过
# Windows
.\gradlew.bat :api:run
# Linux
./gradlew :api:run(4)控制台应用程序:将其作为控制台应用程序运行在任意一个分支中
# Windows
.\gradlew.bat :client:run
# Linux
./gradlew :client:run发布于 2022-08-02 10:01:11
我创建了一个Javalin GitHub问题,描述了同样的问题。到目前为止,这个问题已经解决了,但出于方便的原因,我也将在Stackoverflow上删除这个解决方案。
将以下行添加到api项目的模块描述符(api)解决了这个问题:
requires io.javalin;
requires com.fasterxml.jackson.databind;
requires org.slf4j.simple;
requires kotlin.stdlib; <-- simply add this line here
uses org.example.services.api.PersonReader;根本原因似乎是Javalin还没有模块化。如果您仔细观察模块解析(将--show-module-resolution arg传递给java),您将看到Javalin被视为一个自动模块,并且自动生成的该自动模块的requires语句不包括kotlin.stdlib。
如果Javalin变得模块化,这就不再是一个问题了。在此之前,这是一个可行的解决方案,也可以应用于其他尚未模块化的项目。
https://stackoverflow.com/questions/73123077
复制相似问题