[ http://issues.apache.org/jira/browse/AXIS-2146?page=comments#action_12364088 ]
Tom Jordahl commented on AXIS-2146: ----------------------------------- Wouldn't the change be for the attachement code to use the ClassUtils function instead? If I recall correctly, ClassUtils solves problems in class loading for various configurations such as App servers and the like. > Different class loading used in attachment type mapping causing > NoClassDefFoundError > ------------------------------------------------------------------------------------ > > Key: AXIS-2146 > URL: http://issues.apache.org/jira/browse/AXIS-2146 > Project: Apache Axis > Type: Bug > Components: Serialization/Deserialization > Versions: 1.2.1 > Environment: Windows 2000 > Reporter: Kathy Chan > > Driver: Axis 1.2.1 > The problem is that when the Eclipse WTP Web services wizard invokes the > Java2WSDLAxisAnt task, the > task itself will construct an AntClassLoader around the classpath that the WS > wizard passes into the task. > When creating Web service using Axis 1.2.1 runtime on a Tomcat 4.1 server, > the classpath contains activation.jar and mail.jar. > After the AntClassLoader is constructed, Axis will CACHE this classloader in > a > class call ClassUtils. Later on, when the TypeMappingRegistry is initialized, > the TypeMappingRegistry will determine whether type mapping for attachment is > needed. The way this is determined is by calling: > ClassUtils.forName("javax.activiation.DataHandler"); > Of course, when creating a Web service on Axis using Tomcat 4.1, > this returns true because ClassUtils uses the CACHED AntClassLoader, > which has activation.jar and mail.jar on its classpath. So the > TypeMappingRegistry will go ahead and initialize the type mapping for > attachment. However, in the attachment type mapping's initialization method, > it > does a: > Class.forName("javax.activiation.DataHandler"); > instead of a: > ClassUtils.forName("javax.activiation.DataHandler"); > Since Class.forName("...") will go to the Eclipse class loader, which does > not > have activation.jar and mail.jar on its classpath. A NoClassDefFoundError is > being thrown. > This problem only starts happening with Axis 1.2.1. The same scenario works > in Axis 1.1 and Axis 1.0. > This problem does not occur when using Tomcat 5.0 since mail.jar and > activation.jar is not in the classpath > passed to Java2WSDLAxisAnt task. > Here's the exception being thrown: > --- Nested Exception --- > java.lang.NoClassDefFoundError: javax/activation/DataSource > at java.lang.Class.forName0(Native Method) > at java.lang.Class.forName(Class.java:141) > at > org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory.class$(J > AFDataHandlerSerializerFactory.java:37) > at > org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory.getSeria > lizerClass(JAFDataHandlerSerializerFactory.java:46) > at > org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory.<init>(J > AFDataHandlerSerializerFactory.java:34) > at > org.apache.axis.encoding.DefaultTypeMappingImpl.initMappings(DefaultT > ypeMappingImpl.java:120) > at > org.apache.axis.encoding.DefaultTypeMappingImpl.<init>(DefaultTypeMap > pingImpl.java:91) > at > org.apache.axis.encoding.DefaultTypeMappingImpl.getSingletonDelegate( > DefaultTypeMappingImpl.java:85) > at > org.apache.axis.encoding.TypeMappingRegistryImpl.<init>(TypeMappingRe > gistryImpl.java:155) > at > org.apache.axis.encoding.TypeMappingRegistryImpl.<init>(TypeMappingRe > gistryImpl.java:149) > at org.apache.axis.wsdl.fromJava.Emitter.<clinit>(Emitter.java:747) > at > org.apache.axis.tools.ant.wsdl.Java2WsdlAntTask.execute(Java2WsdlAntT > ask.java:172) > at > org.eclipse.jst.ws.internal.axis.consumption.core.command.Java2WSDLCo > mmand.executeAntTask(Java2WSDLCommand.java:144) > at > org.eclipse.jst.ws.internal.axis.consumption.core.command.Java2WSDLCo > mmand.execute(Java2WSDLCommand.java:81) > at > org.eclipse.wst.command.internal.env.core.fragment.CommandFragmentEng > ine.runCommand(CommandFragmentEngine.java:335) > at > org.eclipse.wst.command.internal.env.core.fragment.CommandFragmentEng > ine.visitTop(CommandFragmentEngine.java:301) > at > org.eclipse.wst.command.internal.env.core.fragment.CommandFragmentEng > ine.moveForwardToNextStop(CommandFragmentEngine.java:217) > at > org.eclipse.wst.command.internal.env.ui.widgets.SimpleCommandEngineMa > nager$4.run(SimpleCommandEngineManager.java:208) > at > org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalCont > ext.java:346) > at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:291) > at org.eclipse.jface.wizard.WizardDialog.run(WizardDialog.java:830) > at > org.eclipse.wst.command.internal.env.ui.widgets.SimpleCommandEngineMa > nager.runForwardToNextStop(SimpleCommandEngineManager.java:177) > at > org.eclipse.wst.command.internal.env.ui.widgets.WizardPageManager.run > ForwardToNextStop(WizardPageManager.java:80) > at > org.eclipse.wst.command.internal.env.ui.widgets.WizardPageManager.get > NextPage(WizardPageManager.java:119) > at > org.eclipse.wst.command.internal.env.ui.widgets.SimpleWizardPage.getN > extPage(SimpleWizardPage.java:120) > at > org.eclipse.jface.wizard.WizardDialog.nextPressed(WizardDialog.java:7 > 47) > at > org.eclipse.jface.wizard.WizardDialog.buttonPressed(WizardDialog.java > :345) > at org.eclipse.jface.dialogs.Dialog$2.widgetSelected(Dialog.java:556) > at > org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java: > 90) > at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66) > at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:843) > at > org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3080) > at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2713) > at org.eclipse.jface.window.Window.runEventLoop(Window.java:809) > at org.eclipse.jface.window.Window.open(Window.java:787) > at > org.eclipse.wst.command.internal.env.ui.widgets.popup.DynamicPopupWiz > ard.run(DynamicPopupWizard.java:129) > at > org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:2 > 46) > at > org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection > (ActionContributionItem.java:538) > at > org.eclipse.jface.action.ActionContributionItem.access$2(ActionContri > butionItem.java:488) > at > org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionC > ontributionItem.java:400) > at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66) > at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:843) > at > org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3080) > at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2713) > at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1699) > at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1663) > at > org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.jav > a:367) > at > org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:143) > at > org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:10 > 3) > at > org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformAct > ivator.java:226) > at > org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.ja > va:376) > at > org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.ja > va:163) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. > java:39) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces > sorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:324) > at org.eclipse.core.launcher.Main.invokeFramework(Main.java:334) > at org.eclipse.core.launcher.Main.basicRun(Main.java:278) > at org.eclipse.core.launcher.Main.run(Main.java:973) > at org.eclipse.core.launcher.Main.main(Main.java:948) > We had to workaround the problem by explicitely not passing in mail.jar and > activation.jar (even though > they are in the Tomcat 4.1 runtime library) when calling setClasspath for > Java2WSDLAxisAnt task > so that Axis determines that isAttachmentEnabled is false and thus not do > further attachment > type mapping processing. > We were trying to see if there's a way to manually set "isAttachmentEnable" > to be false but could not found one. > It would be helpful if an API exist for the user to optionally disable > attachment processing rather than having the Axis > code "detects" it. > Please let me know If you need any more information isolating the problem. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira
