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
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