javaapache-kafkawildflynoclassdeffounderrormicroprofile

Wildfly 33 microprofile unsatisfied dependencies for type Emitter


I am trying to build sample project with microprofile and kafka combo. I am deploying my project to Wildfly 33 / Java 17. However during the deployment I am getting following exception:

13:53:53,359 INFO  [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 78) RESTEASY002225: Deploying jakarta.ws.rs.core.Application: class com.ropogit.rest.application.WfprofileKafkaApplication$Proxy$_$$_WeldClientProxy
13:53:53,368 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 78) MSC000001: Failed to start service jboss.deployment.unit."wfmicroprofile-reactive-kafka.war".undertow-deployment: org.jboss.msc.service.StartException in service jboss.deployment.unit."wfmicroprofile-reactive-kafka.war".undertow-deployment: java.lang.NoClassDefFoundError: org/eclipse/microprofile/reactive/messaging/Emitter
        at org.wildfly.extension.undertow@33.0.2.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:73)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at org.jboss.threads@2.4.0.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
        at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990)
        at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
        at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
        at java.base/java.lang.Thread.run(Thread.java:833)
        at org.jboss.threads@2.4.0.Final//org.jboss.threads.JBossThread.run(JBossThread.java:513)
Caused by: java.lang.NoClassDefFoundError: org/eclipse/microprofile/reactive/messaging/Emitter
        at java.base/java.lang.Class.getDeclaredFields0(Native Method)
        at java.base/java.lang.Class.privateGetDeclaredFields(Class.java:3297)
        at java.base/java.lang.Class.getDeclaredFields(Class.java:2371)
        at org.jboss.resteasy.resteasy-core-spi@6.2.10.Final//org.jboss.resteasy.spi.metadata.ResourceBuilder.processDeclaredFields(ResourceBuilder.java:921)
        at org.jboss.resteasy.resteasy-core-spi@6.2.10.Final//org.jboss.resteasy.spi.metadata.ResourceBuilder.processFields(ResourceBuilder.java:903)
        at org.jboss.resteasy.resteasy-core-spi@6.2.10.Final//org.jboss.resteasy.spi.metadata.ResourceBuilder.fromAnnotations(ResourceBuilder.java:766)
        at org.jboss.resteasy.resteasy-core-spi@6.2.10.Final//org.jboss.resteasy.spi.metadata.ResourceBuilder.getRootResourceFromAnnotations(ResourceBuilder.java:735)
        at org.jboss.resteasy.resteasy-core@6.2.10.Final//org.jboss.resteasy.plugins.server.resourcefactory.POJOResourceFactory.<init>(POJOResourceFactory.java:38)
        at org.jboss.resteasy.resteasy-core@6.2.10.Final//org.jboss.resteasy.core.ResourceMethodRegistry.addPerRequestResource(ResourceMethodRegistry.java:81)
        at org.jboss.resteasy.resteasy-core@6.2.10.Final//org.jboss.resteasy.core.ResteasyDeploymentImpl.registerResources(ResteasyDeploymentImpl.java:492)
        at org.jboss.resteasy.resteasy-core@6.2.10.Final//org.jboss.resteasy.core.ResteasyDeploymentImpl.registration(ResteasyDeploymentImpl.java:460)
        at org.jboss.resteasy.resteasy-core@6.2.10.Final//org.jboss.resteasy.core.ResteasyDeploymentImpl.startInternal(ResteasyDeploymentImpl.java:163)
        at org.jboss.resteasy.resteasy-core@6.2.10.Final//org.jboss.resteasy.core.ResteasyDeploymentImpl.start(ResteasyDeploymentImpl.java:128)
        at org.jboss.resteasy.resteasy-core@6.2.10.Final//org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.init(ServletContainerDispatcher.java:134)
        at org.jboss.resteasy.resteasy-core@6.2.10.Final//org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.init(HttpServletDispatcher.java:39)
        at io.undertow.servlet@2.3.17.Final//io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:117)
        at org.wildfly.security.elytron-web.undertow-server-servlet@4.1.0.Final//org.wildfly.elytron.web.undertow.server.servlet.RunAsLifecycleInterceptor.doIt(RunAsLifecycleInterceptor.java:70)
        at org.wildfly.security.elytron-web.undertow-server-servlet@4.1.0.Final//org.wildfly.elytron.web.undertow.server.servlet.RunAsLifecycleInterceptor.init(RunAsLifecycleInterceptor.java:76)
        at io.undertow.servlet@2.3.17.Final//io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:103)
        at io.undertow.servlet@2.3.17.Final//io.undertow.servlet.core.ManagedServlet$DefaultInstanceStrategy.start(ManagedServlet.java:304)
        at io.undertow.servlet@2.3.17.Final//io.undertow.servlet.core.ManagedServlet.createServlet(ManagedServlet.java:140)
        at io.undertow.servlet@2.3.17.Final//io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:589)
        at io.undertow.servlet@2.3.17.Final//io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:559)
        at io.undertow.servlet@2.3.17.Final//io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
        at io.undertow.servlet@2.3.17.Final//io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
        at org.wildfly.extension.undertow@33.0.2.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1421)
        at org.wildfly.extension.undertow@33.0.2.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1421)
        at org.wildfly.extension.undertow@33.0.2.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1421)
        at org.wildfly.extension.undertow@33.0.2.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1421)
        at io.undertow.servlet@2.3.17.Final//io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:605)
        at org.wildfly.extension.undertow@33.0.2.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:89)
        at org.wildfly.extension.undertow@33.0.2.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:70)
        ... 8 more
Caused by: java.lang.ClassNotFoundException: org.eclipse.microprofile.reactive.messaging.Emitter from [Module "deployment.wfmicroprofile-reactive-kafka.war" from Service Module Loader]
        at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:200)
        at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:408)
        at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:396)
        at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:115)
        ... 40 more

How can I properly deploy my project?

Here is my setup

Endpoint:

@ApplicationScoped
@Path("/kafka")
public class KafkaEndpoint {
    private static final Logger LOG = LoggerFactory.getLogger(KafkaEndpoint.class);

    @Inject
    @Channel("to-kafka")
    private Emitter<String> em;
    
    @GET
    @Path("/test/{message}")
    public Response getTest(@PathParam("message") String message) {
        LOG.info("Starting rest...");
        em.send(message);
        return Response.ok("Message sent").build();
    }

    @Incoming("to-kafka")
    public void processMessage(String message) {
        LOG.info("Message received: {}", message);
    }
}

properties

mp.messaging.outgoing.to-kafka.connector=smallrye-kafka
mp.messaging.outgoing.to-kafka.topic=my-topic
mp.messaging.outgoing.to-kafka.bootstrap.servers=localhost:9092
mp.messaging.outgoing.to-kafka.value.serializer=org.apache.kafka.common.serialization.StringSerializer

parent pom dependency

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.wildfly.bom</groupId>
                <artifactId>wildfly-microprofile</artifactId>
                <version>33.0.2.Final</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

pom

<dependencies>
        <dependency>
            <groupId>jakarta.enterprise</groupId>
            <artifactId>jakarta.enterprise.cdi-api</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jakarta.ws.rs</groupId>
            <artifactId>jakarta.ws.rs-api</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.eclipse.microprofile.reactive.messaging</groupId>
            <artifactId>microprofile-reactive-messaging-api</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>

Wildfly 33.0.2.Final

I tried two setups. (both are producing the same error.)

Plugin configuration below (version is supplied from main pom "5.0.0.Final"):

            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
                <configuration>
                    <addUser>
                        <users>
                            <user>
                                <username>adm</username>
                                <password>changeit</password>
                                <realm>ManagementRealm</realm>
                            </user>
                        </users>
                    </addUser>
                    <filename>${project.build.finalName}.${project.packaging}</filename>
                    <feature-packs>
                        <feature-pack>
                            <groupId>org.wildfly</groupId>
                            <artifactId>wildfly-ee-galleon-pack</artifactId>
                        </feature-pack>
                    </feature-packs>
                    <layers>
                        <layer>jaxrs</layer>
                        <layer>microprofile-reactive-messaging</layer>
                        <layer>microprofile-reactive-messaging-kafka</layer>
                    </layers>
                </configuration>
            </plugin>

Solution

  • You need to add the MicroProfile Reactive Messaging subsystem. It's not included in the default configurations. This can be done with the following CLI commands:

    /extension=org.wildfly.extension.microprofile.reactive-streams-operators-smallrye:add
    /subsystem=microprofile-reactive-streams-operators-smallrye:add
    
    /extension=org.wildfly.extension.microprofile.reactive-messaging-smallrye:add
    /subsystem=microprofile-reactive-messaging-smallrye:add
    
    :reload