基于Dapr+Quarkus+Gradle构建Pub/Sub Demo遇ClassNotFoundException错误
问题:Quarkus + Dapr + Gradle构建Pub/Sub程序时出现NoClassDefFoundError错误
尝试基于Quarkus Dapr示例仓库构建简单Pub/Sub演示程序,在Quarkus启动或构建时抛出如下错误:
[error]: Build step io.quarkiverse.dapr.deployment.DaprProcessor#vertxProviders threw an exception: java.lang.NoClassDefFoundError: javax/ws/rs/ext/MessageBodyReader at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1013) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:506) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:466) at io.quarkiverse.dapr.deployment.DaprProcessor.vertxProviders(DaprProcessor.java:115) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:577) at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:858) at io.quarkus.builder.BuildContext.run(BuildContext.java:282) at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18) at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1512) at java.base/java.lang.Thread.run(Thread.java:833) at org.jboss.threads.JBossThread.run(JBossThread.java:501) Caused by: java.lang.ClassNotFoundException: javax.ws.rs.ext.MessageBodyReader 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:521) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:516) at io.quarkus.bootstrap.classloading.QuarkusClassLoader.loadClass(QuarkusClassLoader.java:466) ... 14 more
相关配置文件
build.gradle
plugins { id 'java' id 'io.quarkus' } wrapper{ gradleVersion = '7.6' distributionUrl = distributionUrl.replace("bin", "all") } group 'com.test' version '1.0.0-SNAPSHOT' repositories { mavenLocal() mavenCentral() jcenter() } dependencies { implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}") implementation 'io.dapr:dapr-sdk:1.9.0' implementation 'io.dapr:dapr-sdk-actors:1.9.0' implementation 'io.quarkiverse.dapr:quarkus-dapr:1.0.4' implementation 'io.quarkus:quarkus-resteasy-reactive-jackson' implementation 'io.quarkus:quarkus-arc' // implementation 'io.quarkus:quarkus-resteasy-reactive' // implementation 'io.quarkus:quarkus-rest-client-reactive-jackson' compileOnly 'org.projectlombok:lombok:1.18.28' annotationProcessor 'org.projectlombok:lombok:1.18.28' testCompileOnly 'org.projectlombok:lombok:1.18.28' testAnnotationProcessor 'org.projectlombok:lombok:1.18.28' testImplementation 'io.quarkus:quarkus-junit5' testImplementation 'io.rest-assured:rest-assured' } java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } compileJava { options.encoding = 'UTF-8' options.compilerArgs << '-parameters' } test { systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" } compileTestJava { options.encoding = 'UTF-8' }
gradle.properties
#Gradle properties quarkusPluginId=io.quarkus quarkusPluginVersion=3.3.0 quarkusPlatformGroupId=io.quarkus.platform quarkusPlatformArtifactId=quarkus-bom quarkusPlatformVersion=3.3.0
业务代码(PubsubResource.java)
package io.quarkiverse.dapr.demo; import java.util.concurrent.atomic.AtomicInteger; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.POST; import jakarta.ws.rs.Path; import io.dapr.Topic; import io.dapr.client.domain.CloudEvent; import io.quarkiverse.dapr.core.SyncDaprClient; @Path("/pubsub") @ApplicationScoped public class PubsubResource { private final AtomicInteger counter = new AtomicInteger(1); @Inject SyncDaprClient dapr; @GET public String hello() { return "Hello, this is quarkus-dapr demo app1"; } @GET @Path("/trigger/topic1") public String triggerSendEvent2Topic1() { int content = counter.getAndIncrement(); dapr.publishEvent("topic1", content); System.out.println("App1 succeeds to send event to topic1 with content=" + content); return "App1 succeeds to send event to topic1 with content=" + content; } @POST @Path("/topic2") @Topic(name = "topic2") public String eventOnTopic2(String content) { System.out.println("App1 received event from topic2: content=" + content); return "App1 received event from topic2"; } @POST @Path("/topic3") @Topic(name = "topic3") public String eventOnTopic3(CloudEvent<String> event) { String content = event.getData(); System.out.println("App1 received event from topic3: content=" + content); return "App1 received event from topic3"; } @POST @Path("/topic4") @Topic(name = "topic4") public String eventOnTopic4(CloudEvent<TestData> event) { TestData testData = event.getData(); String content = testData.getContent(); System.out.println("App1 received event from topic4: content=" + content); return "App1 received event from topic4"; } }
解决方案
问题原因
Quarkus 3.x版本已全面从javax包迁移到jakarta包,而使用的quarkus-dapr:1.0.4版本基于Quarkus 2.x开发,依赖旧的javax.ws.rs相关类,导致构建时找不到对应类。
修复步骤
- 升级quarkus-dapr依赖版本:将
build.gradle中的quarkus-dapr依赖替换为兼容Quarkus 3.x的版本(如1.1.0及以上):implementation 'io.quarkiverse.dapr:quarkus-dapr:1.1.0' - 同步依赖并重新构建:执行Gradle命令清理旧依赖后重新构建:
./gradlew clean build
额外说明
若升级后仍有问题,可启用quarkus-rest-client-reactive相关依赖(取消build.gradle中对应注释),Dapr扩展可能依赖该组件进行HTTP通信:
implementation 'io.quarkus:quarkus-resteasy-reactive' implementation 'io.quarkus:quarkus-rest-client-reactive-jackson'
内容的提问来源于stack exchange,提问作者oMG
相关产品推荐
相关产品推荐

