Wildfly 26: NoClassDefFound error for EAR-only dependency

43 views
Skip to first unread message

Laura Schanno

unread,
Mar 13, 2026, 7:19:26 PM (8 days ago) Mar 13
to WildFly

Hello,


I am trying to resolve a NoClassDefFound exception. I am currently migrating an application from Wildfly 17 to Wildfly 26 (limited to Jakarta 8 for now), and have been working to deploy a custom security realm implementation. Our application deploys as an EAR to Wildfly. In addition to that, I have two separate custom Wildfly modules that are deployed as follows:


Module: datawave.security.elytron

This module contains a single resource-root path to the datawave-ws-security-elytron jar, which contains all of our custom elytron classes (security realm, http authentication mechanism, etc.). The module.xml:


<?xml version="1.0" encoding="UTF-8"?>

<module xmlns="urn:jboss:module:1.3" name="datawave.security.elytron">

   <resources>

       <resource-root path="datawave-ws-security-elytron-7.37.0-SNAPSHOT.jar"/>

   </resources>

   <dependencies>

       <module name="datawave.shared-lib"/>

       <!-- <module name="datawave.security.commons"/> -->

       <module name="com.fasterxml.jackson.core.jackson-databind"/>

       <module name="org.slf4j"/>

       <module name="com.google.guava"/>

       <module name="org.wildfly.security.elytron"/>

       <module name="org.wildfly.extension.elytron"/>

   </dependencies>

</module>


Module: datawave.shared-lib

This module contains dependencies that are used both between the datawave.security.elytron module and the deployed EAR. The module.xml:


<?xml version="1.0" encoding="UTF-8"?>

<module xmlns="urn:jboss:module:1.3" name="datawave.shared-lib">

   <resources>

       <resource-root path="datawave-commons-security-1.0.0-SNAPSHOT.jar"/>

       <resource-root path="commons-lang3-3.20.0.jar"/>

       <resource-root path="jackson-datatype-guava-2.12.7.jar"/>

       <resource-root path="jackson-module-jaxb-annotations-2.12.7.jar"/>

       <resource-root path="jjwt-api-0.11.2.jar"/>

       <resource-root path="jjwt-impl-0.11.2.jar"/>

       <resource-root path="jjwt-jackson-0.11.2.jar"/>

   </resources>


   <dependencies>

       <module name="org.slf4j"/>

       <module name="com.google.guava"/>

       <module name="javax.xml.bind.api"/>

       <module name="com.fasterxml.jackson.core.jackson-core"/>

       <module name="com.fasterxml.jackson.core.jackson-databind"/>

       <module name="com.fasterxml.jackson.core.jackson-annotations"/>

       <module name="javax.annotation.api"/>

   </dependencies>

</module>


In our application EAR, I have the following jboss-deployment-structure.xml where we add a dependency on the datawave.shared-lib module.


<?xml version="1.0" encoding="UTF-8"?>

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">

   <!-- Share classpath across all sub-deployments -->

   <ear-subdeployments-isolated>false</ear-subdeployments-isolated>


   <deployment>

       <dependencies>

           <module name="datawave.webservice.configuration" export="true" />

           <module name="datawave.shared-lib" export="true"/>

           <module name="org.apache.hadoop.common" export="true" />

           <!-- Fixes Spring context loading issues on Java 11 -->

           <module name="jdk.unsupported" export="true" />

           <module name="org.slf4j" export="true"/>

           <module name="com.google.guava" export="true"/>

           <module name="com.fasterxml.jackson.core.jackson-core" export="true"/>

           <module name="com.fasterxml.jackson.core.jackson-databind" export="true"/>

           <module name="com.fasterxml.jackson.core.jackson-annotations" export="true"/>

       </dependencies>

       <exclusions>

           <module name="org.apache.commons.lang3"/>

       </exclusions>

   </deployment>

</jboss-deployment-structure>


Dependencies for the EAR are places within its lib folder. Our REST API paths are served by classes in WARs bundled in the EAR, and all of the internal WARs are expected to grab the JARs for their classpaths from the top-level lib folder.


I am getting a NoClassDefFound error for the class org.apache.commons.text.StringEscapeUtils when making a request to the endpoint /DataWave/Security/Admin/Credentials/listDNs. This class is found within the library org.apache.commons-commons-text-1.11.0.jar, which I verified is present in the /lib folder and is listed in the Class-Path attribute of the MANIFEST.MF for the WAR that defines the REST endpoint.

The library commons-text is not bundled with the datawave.shared-lib module because it is not a required dependency for my custom Elytron classes in the module datawave.security.elytron. Below is the full stack trace. The error occurs after authentication has succeeded.


2026-03-13 22:36:25,224 ERROR [io.undertow.request] (default task-4)  UT005023: Exception handling request to /DataWave/Security/Admin/Credentials/listDNs: java.lang.NoClassDefFoundError: Could not initialize class org.apache.commons.text.StringEscapeUtils

   at deployment.datawave-ws-deploy-application-7.37.0-SNAPSHOT-compose.ear//datawave.security.DnList.getMainContent(DnList.java:119)

   at deployment.datawave-ws-deploy-application-7.37.0-SNAPSHOT-compose.ear//datawave.webservice.util.HtmlProviderMessageBodyWriter.getMainContent(HtmlProviderMessageBodyWriter.java:40)

   at deployment.datawave-ws-deploy-application-7.37.0-SNAPSHOT-compose.ear//datawave.webservice.util.HtmlProviderMessageBodyWriter.getMainContent(HtmlProviderMessageBodyWriter.java:10)

   at deployment.datawave-ws-deploy-application-7.37.0-SNAPSHOT-compose.ear//datawave.webservice.util.AbstractHtmlProviderMessageBodyWriter.createHtml(AbstractHtmlProviderMessageBodyWriter.java:77)

   at deployment.datawave-ws-deploy-application-7.37.0-SNAPSHOT-compose.ear//datawave.webservice.util.AbstractHtmlProviderMessageBodyWriter.writeTo(AbstractHtmlProviderMessageBodyWriter.java:45)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.interception.jaxrs.ServerWriterInterceptorContext.lambda$writeTo$1(ServerWriterInterceptorContext.java:79)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.plugins.server.servlet.Servlet3AsyncHttpRequest$Servlet3ExecutionContext.executeBlockingIo(Servlet3AsyncHttpRequest.java:350)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.interception.jaxrs.ServerWriterInterceptorContext.writeTo(ServerWriterInterceptorContext.java:79)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.interception.jaxrs.AbstractWriterInterceptorContext.syncProceed(AbstractWriterInterceptorContext.java:245)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.interception.jaxrs.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:224)

   at deployment.datawave-ws-deploy-application-7.37.0-SNAPSHOT-compose.ear//datawave.resteasy.interceptor.BaseMethodStatsInterceptor.doWrite(BaseMethodStatsInterceptor.java:116)

   at deployment.datawave-ws-deploy-application-7.37.0-SNAPSHOT-compose.ear//datawave.resteasy.interceptor.LoggingInterceptor.aroundWriteTo(LoggingInterceptor.java:28)

   at deployment.datawave-ws-deploy-application-7.37.0-SNAPSHOT-compose.ear//datawave.resteasy.interceptor.LoggingInterceptor$Proxy$_$$_WeldClientProxy.aroundWriteTo(Unknown Source)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.interception.jaxrs.AbstractWriterInterceptorContext.syncProceed(AbstractWriterInterceptorContext.java:254)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.interception.jaxrs.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:224)

   at org.jboss.resteas...@4.7.7.Final//org.jboss.resteasy.security.doseta.DigitalSigningInterceptor.aroundWriteTo(DigitalSigningInterceptor.java:127)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.interception.jaxrs.AbstractWriterInterceptorContext.syncProceed(AbstractWriterInterceptorContext.java:254)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.interception.jaxrs.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:224)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.plugins.interceptors.GZIPEncodingInterceptor.aroundWriteTo(GZIPEncodingInterceptor.java:103)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.interception.jaxrs.AbstractWriterInterceptorContext.syncProceed(AbstractWriterInterceptorContext.java:254)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.interception.jaxrs.AbstractWriterInterceptorContext.getStarted(AbstractWriterInterceptorContext.java:170)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.interception.jaxrs.ServerWriterInterceptorContext.lambda$getStarted$0(ServerWriterInterceptorContext.java:73)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.interception.jaxrs.ServerWriterInterceptorContext.aroundWriteTo(ServerWriterInterceptorContext.java:93)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.interception.jaxrs.ServerWriterInterceptorContext.getStarted(ServerWriterInterceptorContext.java:73)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.ServerResponseWriter.lambda$writeNomapResponse$3(ServerResponseWriter.java:163)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.interception.jaxrs.ContainerResponseContextImpl.filter(ContainerResponseContextImpl.java:410)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.ServerResponseWriter.executeFilters(ServerResponseWriter.java:252)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.java:101)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.java:74)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.SynchronousDispatcher.writeResponse(SynchronousDispatcher.java:594)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:524)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:261)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:161)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:164)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:247)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:249)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:60)

   at org.jboss.restea...@4.7.7.Final//org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)

   at javax.se...@2.0.0.Final//javax.servlet.http.HttpServlet.service(HttpServlet.java:590)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)

   at io.opentracing.contrib.opentracing-jaxrs2//io.opentracing.contrib.jaxrs2.server.SpanFinishingFilter.doFilter(SpanFinishingFilter.java:52)

   at io.undert...@2.2.19.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)

   at org.wildfly.security.ely...@1.10.1.Final//org.wildfly.elytron.web.undertow.server.ElytronRunAsHandler.lambda$handleRequest$1(ElytronRunAsHandler.java:68)

   at org.wildfly.secu...@1.19.1.Final//org.wildfly.security.auth.server.FlexibleIdentityAssociation.runAsFunctionEx(FlexibleIdentityAssociation.java:103)

   at org.wildfly.secu...@1.19.1.Final//org.wildfly.security.auth.server.Scoped.runAsFunctionEx(Scoped.java:161)

   at org.wildfly.secu...@1.19.1.Final//org.wildfly.security.auth.server.Scoped.runAs(Scoped.java:73)

   at org.wildfly.security.ely...@1.10.1.Final//org.wildfly.elytron.web.undertow.server.ElytronRunAsHandler.handleRequest(ElytronRunAsHandler.java:67)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)

   at io.under...@2.2.19.Final//io.undertow.server.handlers.DisableCacheHandler.handleRequest(DisableCacheHandler.java:33)

   at io.under...@2.2.19.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

   at io.under...@2.2.19.Final//io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.java:53)

   at io.under...@2.2.19.Final//io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.java:59)

   at io.under...@2.2.19.Final//io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)

   at org.wildfly.security.elytron...@1.10.1.Final//org.wildfly.elytron.web.undertow.server.servlet.CleanUpHandler.handleRequest(CleanUpHandler.java:38)

   at io.under...@2.2.19.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

   at org.wildfly.ext...@26.1.3.Final//org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)

   at io.under...@2.2.19.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

   at org.wildfly.ext...@26.1.3.Final//org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)

   at io.under...@2.2.19.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)

   at io.undert...@2.2.19.Final//io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)

   at io.undert...@2.2.19.Final//io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)

   at org.wildfly.ext...@26.1.3.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1544)

   at org.wildfly.ext...@26.1.3.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1544)

   at org.wildfly.ext...@26.1.3.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1544)

   at org.wildfly.ext...@26.1.3.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1544)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:79)

   at io.undert...@2.2.19.Final//io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:100)

   at io.under...@2.2.19.Final//io.undertow.server.Connectors.executeRootHandler(Connectors.java:387)

   at io.under...@2.2.19.Final//io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)

   at org.jbos...@2.4.0.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)

   at org.jbos...@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990)

   at org.jbos...@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)

   at org.jbos...@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)

   at org.jbo...@3.8.7.Final//org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)

   at java.base/java.lang.Thread.run(Thread.java:829)


I would appreciate any suggestions on how to resolve this. Am I taking the right approach in using the separate datawave.shared-lib module to share dependencies (and their classloader) between my EAR and my elytron module?


Thanks,


Laura


Laura Schanno

unread,
Mar 16, 2026, 8:59:43 PM (5 days ago) Mar 16
to WildFly
Interestingly enough, this error only happens when performing a GET to the endpoint via a browser, and not when performing the GET via curl or another tool such as Bruno.

Laura Schanno

unread,
Mar 17, 2026, 1:01:01 PM (5 days ago) Mar 17
to WildFly

To help with diagnosing, below are the headers for the CURL request which succeeded:

Method: GET 

Request Headers { 

    accept -> application/json 

    content-type -> application/x-www-form-urlencoded;charset=UTF-8 

    Host -> ec2-98-90-54-112.compute-1.amazonaws.com:9443 

    user-agent -> curl/8.5.0


And the headers for the browser (Firefox) request which failed:

Method:GET
Request Headers { 

    accept -> text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 

    accept-encoding -> gzip, deflate, br, zstd 

    accept-language -> en-US,en;q=0.5 cookie -> JSESSIONID=pR6lrwYtis-pePrh5XlpEojWzUsVEOBS7-ZcObIT.f37636abb1cd,_ga=GA1.4.1961471369.1764577125,_ga_SR3H6G8EBP=GS2.4.s1773709886$o26$g1$t1773711312$j4$l0$h0,JSESSIONID=AdBs2GNXRktdxFpBkArKqUKCNMH-DfDMfVrZ-TxO.ad33e7e7fbf7,_gid=GA1.4.578387456.1773709882 

    dnt -> 1 

    Host -> ec2-98-90-54-112.compute-1.amazonaws.com:9443 

    priority -> u=0, i 

    referer -> https://ec2-98-90-54-112.compute-1.amazonaws.com:9443/DataWave/doc/ 

    sec-fetch-dest -> document 

    sec-fetch-mode -> navigate 

    sec-fetch-site -> same-origin 

    sec-fetch-user -> ?1 

    sec-gpc -> 1 

    te -> trailers 

    upgrade-insecure-requests -> 1 

    user-agent -> Mozilla/5.0 (X11; Linux x86_64; rv:146.0) Gecko/20100101 Firefox/146.0

John Burgess

unread,
Mar 17, 2026, 4:20:40 PM (4 days ago) Mar 17
to Laura Schanno, WildFly
Oh dear.
Maybe race condition


From: wil...@googlegroups.com <wil...@googlegroups.com> on behalf of Laura Schanno <lbsc...@gmail.com>
Sent: Tuesday, March 17, 2026 5:01:00 PM
To: WildFly <wil...@googlegroups.com>
Subject: Re: Wildfly 26: NoClassDefFound error for EAR-only dependency
 
--
You received this message because you are subscribed to the Google Groups "WildFly" group.
To unsubscribe from this group and stop receiving emails from it, send an email to wildfly+u...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/wildfly/c3e8deda-d0da-45b5-b799-d00f59b1b27fn%40googlegroups.com.

John Saccoccio

unread,
Mar 18, 2026, 2:48:32 PM (3 days ago) Mar 18
to WildFly
Having the bruises of Wildfly trial and error fixes, an easy try would be to add the org.apache.commons.text library in the  datawave.shared-lib module resource-root list?

Laura Schanno

unread,
Mar 19, 2026, 3:37:02 PM (2 days ago) Mar 19
to WildFly
It turns out there is a another custom module I didn’t know about that we were creating for adding hadoop libraries. This module loads its own copy of the commons-text jar, and is likely the culprit for these issues. I’ll clean those common dependencies and report back with the results.
Reply all
Reply to author
Forward
0 new messages