gradle - 开发模式下缺少传递依赖
问题描述
在使用 Quarkus 构建的简单 REST 服务中,如果服务在开发模式下运行,则会引发ClassNotFoundException 。使用 uber-jar,它可以正常工作。
我怎样才能让服务也在开发模式下工作?
缺少的类属于 QR 账单生成器库的传递依赖项,声明为build.gradle
:
dependencies {
...
implementation 'net.codecrete.qrbill:qrbill-generator:2.2.2'
...
}
该错误仅发生在开发模式 ( gradle quarkusDev
) 中。如果 REST 请求需要使用qrbill:qrbill-generator库,则会触发它:
2020-05-03 12:11:49,463 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (executor-thread-1) HTTP Request to /xxx/yyy failed, error id: 89c5b7f8-c762-4f7f-959b-67f16b2bc120-1: org.jboss.resteasy.spi.UnhandledException: java.lang.NoClassDefFoundError: io/nayuki/qrcodegen/QrCode$Ecc
at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:106)
at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:372)
at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:216)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:515)
at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:259)
at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:160)
[several lines omitted]
Caused by: java.lang.NoClassDefFoundError: io/nayuki/qrcodegen/QrCode$Ecc
at net.codecrete.qrbill.generator.QRCode.draw(QRCode.java:49)
at net.codecrete.qrbill.generator.BillLayout.drawPaymentPart(BillLayout.java:131)
at net.codecrete.qrbill.generator.BillLayout.draw(BillLayout.java:94)
[several lines omitted]
Caused by: java.lang.ClassNotFoundException: io.nayuki.qrcodegen.QrCode$Ecc
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:341)
at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:294)
... 44 more
在分析依赖关系时,我可以看到io.nayuki:qrcodegen:1.6.0是runtimeClasspath的一部分,但不是compileClasspath的一部分。这看起来不错。
难道 Quarkus 开发模式使用了错误的类路径?
解决方案
推荐阅读
- django - Django:将枚举用于多种语言表和选择
- async-await - 我的异步函数中的等待变量似乎没有逐行执行
- sbt - 在 ZSH 的后台运行 SBT
- javascript - 返回数组内的不同值以放入 html 中的选择标记内
- reactjs - 为什么当我在 Chrome 开发工具中检查 var 时它会发生变化?
- android - Kotlin Android Extensions 在库类型模块中不起作用
- angular - 动态替换 Angular 6 中的文件
- python - 在这个 while 循环中发生了什么?
- python - 如何获得 flask_sqlalchemy 类的 PEP 484 类型提示?
- r - 公司代理/防火墙背后的 RSelenium