Uploaded image for project: 'Axis'
  1. Axis
  2. AXIS-2146

Different class loading used in attachment type mapping causing NoClassDefFoundError

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 1.2.1
    • None
    • None
    • Windows 2000

    Description

      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.

      Attachments

        Activity

          People

            Unassigned Unassigned
            kathychan Kathy Chan
            Votes:
            2 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated: