在用JBoss Tools生成Web Service客户端时报这个错。

p_w_picpath

详细错误日志如下:

IWAB0014E Unexpected exception occurred.
      java.lang.NullPointerException
      at org.jboss.tools.ws.creation.core.utils.JBossWSCreationUtils.getJBossWSRuntimeLocation(JBossWSCreationUtils.java:290)
      at org.jboss.tools.ws.creation.core.commands.InitialClientCommand.execute(InitialClientCommand.java:53)
      at org.eclipse.wst.command.internal.env.core.fragment.CommandFragmentEngine.runCommand(CommandFragmentEngine.java:419)
      at org.eclipse.wst.command.internal.env.core.fragment.CommandFragmentEngine.visitTop(CommandFragmentEngine.java:359)
      at org.eclipse.wst.command.internal.env.core.fragment.CommandFragmentEngine.moveForwardToNextStop(CommandFragmentEngine.java:254)
      at org.eclipse.wst.command.internal.env.ui.widgets.SimpleCommandEngineManager$6.run(SimpleCommandEngineManager.java:294)
      at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:464)
      at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:372)
      at org.eclipse.jface.wizard.WizardDialog.run(WizardDialog.java:1008)
      at org.eclipse.wst.command.internal.env.ui.widgets.SimpleCommandEngineManager.runForwardToNextStop(SimpleCommandEngineManager.java:264)
      at org.eclipse.wst.command.internal.env.ui.widgets.WizardPageManager.runForwardToNextStop(WizardPageManager.java:91)
      at org.eclipse.wst.command.internal.env.ui.widgets.WizardPageManager.getNextPage(WizardPageManager.java:154)
      at org.eclipse.wst.command.internal.env.ui.widgets.SimpleWizardPage.getNextPage(SimpleWizardPage.java:136)
      at org.eclipse.jface.wizard.WizardDialog.nextPressed(WizardDialog.java:887)
      at org.eclipse.jface.wizard.WizardDialog.buttonPressed(WizardDialog.java:426)
      at org.eclipse.jface.dialogs.Dialog$2.widgetSelected(Dialog.java:624)
      at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:234)
      at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
      at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
      at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
      at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
      at org.eclipse.jface.window.Window.runEventLoop(Window.java:825)
      at org.eclipse.jface.window.Window.open(Window.java:801)
      at org.eclipse.wst.command.internal.env.ui.widgets.popup.DynamicPopupWizard.run(DynamicPopupWizard.java:130)
      at org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:251)
      at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584)
      at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501)
      at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:411)
      at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
      at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
      at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
      at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
      at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640)
      at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604)
      at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438)
      at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671)
      at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
      at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:664)
      at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
      at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115)
      at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
      at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
      at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
      at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
      at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619)
      at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574)
      at org.eclipse.equinox.launcher.Main.run(Main.java:1407)
      at org.eclipse.equinox.launcher.Main.main(Main.java:1383)

看日志(getJBossWSRuntimeLocation),大概是找不到Runtime。依次检查JBossWS,Server Runtime。

p_w_picpath

p_w_picpath

p_w_picpath

一切都是好的,没有问题呀。

难道是JBoss Server本身出了问题?试试看,重新解压一个jboss-4.2.3.GA.zip,新建一个Server。再试,仍报同样的错误。

难道是Eclipse环境乱了?另开一个Eclipse,导入工程,一试还是报同样的错误。

百思不得其解中,明明早两天还好好的,咋就突然不行了。回想一下这两天都做了什么?写了很多代码,代码跟环境没有任何关系呀;新建或删除了Workspace的若干项目,但这是project级别的,跟JBossWSRuntime应该是井水不犯河水吧。。。

逆向追溯还是没找到答案,那换个角度想想当初我是怎么成功的?曾记否,New 一 WEB 工程。。。猛然想起,当时我是在web工程里做的操作,而现在我的项目是一个普通的 Maven 工程。即刻查看Build Path 属性。

p_w_picpath

我是以依赖的方式加进去的,也许JBoss 找不到,于是把Runtime加进Build Path。满怀期待的重试,再次失败。难道只支持纯粹的Web工程?Copy WSDL到一个Web工程,一跑,果然成功。那么为什么只支持Web工程呢?与一个同事交流后有如下意见:

JBoss Tools Webservice套件默认是需要去查找web.xml的。如果采用Top-Down的方式生成Server端,它默认以Servlet的方式发布。这时如果打开web.xml,你会发现会增加这么一段:

<servlet>
  <display-name>xxxServicesImpl</display-name>
  <servlet-name>xxxvicesImpl</servlet-name>
  <servlet-class>xxx</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>xxxImpl</servlet-name>
  <url-pattern>/xxxImpl</url-pattern>
</servlet-mapping>

希望以后的版本会增加一些选项,可以自己灵活控制发布方式,不受web工程的限制。