В режиме разработки отсутствует транзитивная зависимость - PullRequest
0 голосов
/ 03 мая 2020

В простой REST-службе, созданной с помощью Quarkus, 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 dev использует неверный путь к классу?

...