NoClassDefFoundError in subdeployment when a class is called in EAR/lib that extends a class in the subdeployment's WEB-INF/lib
bryon.williams Apr 10, 2018 3:45 AMIn transitioning a functioning application from JBOSS EAP 6.2 (JBOSS AS 7.3) up to JBOSS EAP 7.1 (WildFly Core 3.x (WildFly 11)), I am encountering an issue with classloading that I am stumped on and am looking for input from the community...
Context --
This is an EAR deployment with a structure that resembles the following:
master.ear
+ lib/
- a.jar
- b.jar
- ...
+ app1.war
WEB-INF/lib
- app_foundation_a.jar
Where:
- a.jar has a class that extends an interface that is located in app_foundation_a.jar
- ear isolated deployments is false
- the error is thrown when using the web app in app1.war
The Error:
2018-04-09 14:35:23,019 ERROR [io.undertow.request] (default task-3) UT005023: Exception handling request to /some/app/resource.jsp: java.lang.NoClassDefFoundError: Failed to link com/company/app/extensions/AppPostLoginProvider (Module "deployment.master.ear" from Service Module Loader): com/vendor/coolApplication/extensibility/login/PostLoginProvider at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:446) at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:274) at org.jboss.modules.ModuleClassLoader$1.loadClassLocal(ModuleClassLoader.java:77) at org.jboss.modules.Module.loadModuleClass(Module.java:713) at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190) at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:412) at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:400) at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) ...
This worked as is under JBOSS AS7.2, but with the new isolated classloader and class loading structure, it now seems that jboss fails to link the class located in ear/lib/a.jar to its base class in ear/app1.war/WEB-INF/lib/app_foundation_a.jar
Aside from moving app_foundation_a.jar to the ear/lib (which breaks other subdeployments, so not an option), and moving a.jar into the war's WEB-INF/lib (which *does* work, but is not officially supported by the application vendor), is there any way to get this dependency to link properly?