首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javalin与JPMS和ServiceLoader导致NoClassDefFoundError: kotlin/NoWhenBranchMatchedException

Javalin与JPMS和ServiceLoader导致NoClassDefFoundError: kotlin/NoWhenBranchMatchedException
EN

Stack Overflow用户
提问于 2022-07-26 12:03:52
回答 1查看 121关注 0票数 1

使用JPMS和ServiceLoader运行Javalin将导致NoClassDefFoundError: kotlin/NoWhenBranchMatchedException。但是,遵循另外两种方法的相同代码运行良好(有关详细信息,请参阅本文末尾):

  • 没有JPMS和ServiceLoader:如果我运行相同的Javalin应用程序,而不是作为JPMS模块运行,并且没有解决依赖关系的ServiceLoader,那么一切都很好。
  • 控制台应用程序:我还可以运行一个控制台应用程序,它是一个真正的JPMS模块,并使用ServiceLoader来解决依赖关系。

复制问题的步骤

(1)克隆main分支

(2)尝试在项目的根文件夹中运行API

代码语言:javascript
复制
# Windows
.\gradlew.bat :api:run

# Linux
./gradlew :api:run

您应该会看到以下错误:

代码语言:javascript
复制
> 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-和服务负载者,然后您可以通过

代码语言:javascript
复制
# Windows
.\gradlew.bat :api:run

# Linux
./gradlew :api:run

(4)控制台应用程序:将其作为控制台应用程序运行在任意一个分支中

代码语言:javascript
复制
# Windows
.\gradlew.bat :client:run

# Linux
./gradlew :client:run
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-02 10:01:11

我创建了一个Javalin GitHub问题,描述了同样的问题。到目前为止,这个问题已经解决了,但出于方便的原因,我也将在Stackoverflow上删除这个解决方案。

将以下行添加到api项目的模块描述符(api)解决了这个问题:

代码语言:javascript
复制
    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变得模块化,这就不再是一个问题了。在此之前,这是一个可行的解决方案,也可以应用于其他尚未模块化的项目。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73123077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档