简体   繁体   中英

Struts 2.5 ClassNotFoundException Issue

I have a Struts problem. I'm upgrading an application from Struts 1.2.x to 2.5.8. I have a single war and multiple EJBs in a single EAR file deploying to WebSphere 8.5. Every time I try to access a simple hello world jsp via a Struts action, I get this stack trace in my browser:

Error Message: javax.servlet.ServletException: Filter [struts2]: could not be initialized
Error Code: 500
Target Servlet: com.ibm.ws.webcontainer.extension.DefaultExtensionProcessor
Error Stack: 
Unable to load configuration. - bean - wsjar:file:/WEB-INF/lib/struts2-core-2.5.8.jar!/struts-default.xml:92:181 
     at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:499) 
     at org.apache.struts2.dispatcher.InitOperations.initDispatcher(InitOperations.java:75) 
     at org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:63) 
     at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.init(FilterInstanceWrapper.java:145) 
     at com.ibm.ws.webcontainer.filter.WebAppFilterManager._loadFilter(WebAppFilterManager.java:607) 
     at com.ibm.ws.webcontainer.filter.WebAppFilterManager.loadFilter(WebAppFilterManager.java:514) 
     at com.ibm.ws.webcontainer.filter.WebAppFilterManager.getFilterInstanceWrapper(WebAppFilterManager.java:319) 
     at com.ibm.ws.webcontainer.filter.WebAppFilterManager.getFilterChain(WebAppFilterManager.java:392) 
     at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:931) 
     at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1107) 
     at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3928) 
     at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304) 
     at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:1007) 
     at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1817) 
     at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:200) 
     at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:463) 
     at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:530) 
     at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:316) 
     at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:287) 
     at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214) 
     at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113) 
     at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175) 
     at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217) 
     at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161) 
     at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138) 
     at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204) 
     at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775) 
     at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905) 
     at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1881) 
     Caused by: Unable to load configuration. - bean - wsjar:file/WEB-INF/lib/struts2-core-2.5.8.jar!/struts-default.xml:92:181 
     at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:70) 
     at org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:906) 
     at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:445) 
     at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:486) 
     ... 28 more 
     Caused by: Unable to load bean: type:org.apache.struts2.dispatcher.multipart.MultiPartRequest class:org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest - bean - wsjar:file:/WEB-INF/lib/struts2-core-2.5.8.jar!/struts-default.xml:92:181 
     at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.register(XmlConfigurationProvider.java:271) 
     at org.apache.struts2.config.StrutsXmlConfigurationProvider.register(StrutsXmlConfigurationProvider.java:98) 
     at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:165) 
     at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67) 
     ... 31 more 
     Caused by: java.lang.NoClassDefFoundError: org.apache.commons.fileupload.FileUploadException 
     at java.lang.J9VMInternals.prepareClassImpl(Native Method) 
     at java.lang.J9VMInternals.prepare(J9VMInternals.java:283) 
     at java.lang.Class.getDeclaredConstructors(Class.java:721) 
     at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.register(XmlConfigurationProvider.java:263) 
     ... 34 more 
     Caused by: java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileUploadException 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:600) 
     at com.ibm.ws.bootstrap.ExtClassLoader.findClass(ExtClassLoader.java:243) 
     at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:786) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:764) 
     at com.ibm.ws.bootstrap.ExtClassLoader.loadClass(ExtClassLoader.java:134) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:741) 
     at com.ibm.ws.classloader.ProtectionClassLoader.loadClass(ProtectionClassLoader.java:62) 
     at com.ibm.ws.classloader.ProtectionClassLoader.loadClass(ProtectionClassLoader.java:58) 
     at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:585) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:741) 
     ... 38 more 

I've verified that the required commons-fileupload jar is in the war and it's not in a shared library location that would cause namespace conflicts. Classloader setting is set to parent first, and due to the complexity of the project, I can't safely change it.

What do I need to do to get past this?

TIA Alex

Looks like I spoke too soon. For some reason, my first search failed to turn up an older version of commons-fileupload in the AppServer/plugins folder. It appears this jar is being used by the app server, and with the parent first classloading in use, there's a class collision taking place. So now I have to figure out how to get around that, but the original problem has been solved.

As long as the classes in your commons-fileupload jar have no dependencies on your application or WAR classes, you can deploy this jar as an isolated shared library and associate it to your application or WAR, whichever has the dependency on the jar. The classloading semantics for isolated shared libraries are described in topic "Isolating open source packages" in the WebSphere Application Server Knowledge Center for versions 8.5.5 and 9.0.

If you are using a recent version of 8.5.5, you might also try always-protected packages, which is also described in "Isolating open source packages". Note that always-protected packages can impact every application running on the application server.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM