哪个是生成Web服务客户端的最好的maven插件?

我必须生成一个WS客户端,我无法决定使用哪个插件。 到目前为止,我的选择是:jaxb2-maven-plugin,axistools-maven-plugin和jaxws-maven-plugin。

我必须生成一个WS客户端,我无法决定使用哪个插件。 到目前为止,我的选择是:jaxb2-maven-plugin,axistools-maven-plugin和jaxws-maven-plugin。

首先, jaxb2-maven-plugin并不是真正用于生成WS客户端。 淘汰。

其次, 我个人不会仅使用Axis进行客户端开发,因此我不建议使用axistools-maven-plugin 。 淘汰。

这给我们留下了JAX-WS RI和Apache CXF堆栈,以及它们各自的Maven插件: JAX-WS Maven插件 (使用JAX-WS Maven插件的说明可以在Usage页面上找到)和cxf-codegen -plugin 。

关于利弊,我会这样总结一下:

  • JAX-WS RI包含在Java 6中,但文档更“粗略”(尽管您也会找到大量有关JAX-WS RI的教程 )。
  • 如果您想要超越规范,Apache CXF可以更好地记录并提供更大的灵活性。

最后,两个选择都不错,所以我建议稍微浏览一下这些链接,并提出自己的看法。

我使用jaxws-maven-plugin。 在我看来,JAX-WS是WS的事实上的标准实现。 它具有比AXIS更好的生成代码,并且更易于配置和实现。 它有Maven和Spring支持。

在pom.xml中从wsdl文件生成客户端代码:

   org.codehaus.mojo jaxws-maven-plugin   generate-reports-ws-code generate-sources  wsimport    ${project.build.directory}/jaxws/stale/.staleFlag.reports com.acme.reports.ws.api ${project.build.directory}/wsdl  InternalReportsAPIService.wsdl  true ${wsdl.generated.source.files.dir}     

用于创建客户端服务bean的接口(不是自动生成的):

 public interface InternalReportsAPIServiceFactory { public InternalReportsAPIService createInternalReportsAPIService(); } 

它的Bean实现:

 public class InternalReportsAPIServiceFactoryBean implements InternalReportsAPIServiceFactory { private URL acmeReportsWsdlURL; private final static QName V1_QNAME = new QName("http://internal.reports.api.acme.net/v1","InternalReportsAPIService"); @Override public InternalReportsAPIService createInternalReportsAPIService() { return new InternalReportsAPIService(acmeReportsWsdlURL, V1_QNAME); } public void setAcmeReportsWsdlUrl(String acmeReportsWsdlUrl) { try { this.acmeReportsWsdlURL = new URL(acmeReportsWsdlUrl); } catch (MalformedURLException ex) { throw new RuntimeException("Acme Reports WSDL URL is bad: "+ex.getMessage(), ex); } } } 

这个bean(用作Spring bean)的想法是有一个单例来生成客户服务代码。 它需要两个输入:WSDL url – 即实现WSDL的服务器的实际URL。 客户端服务代码在构造时,在提供的URL处发送WSDL的get请求。 然后,它根据驻留在自动生成的代码中的注释创建WSDL,并对其进行比较。 我相信这样做是为了确保您正在运行正确的服务器版本。 所以,我已将url放在我的应用程序可访问的属性文件中,因此我在Spring应用程序上下文文件中初始化。

以下是使用工厂生成服务然后使用它的示例:

 InternalReportsAPIService internalReportsAPIService = acmeReportsWSFactory.createInternalReportsAPIService(); InternalReportsAPI port = internalReportsAPIService.getInternalReportsAPIPort(); 

从这里开始,只需使用port变量来调用wsdl上的任何可用操作。

需要Maven插件:

  • cxf-java2ws-plugin(JAX-WS到WSDL)
  • cxf-codegen-plugin(WSDL to Java)

JAX-WS到WSDL通过使用’java2ws’目标配置cxf-java2ws-plugin,从JAX-WS注释类生成WSDL文档。

将JAX-WS注释类所需的cxf-rt-frontend-jaxws依赖项和项目依赖项添加为插件依赖项。

  org.apache.cxf cxf-java2ws-plugin 2.5.1   org.apache.cxf cxf-rt-frontend-jaxws 2.5.1   com.medici.app services 0.0.1-SNAPSHOT     generate-sources generate-sources  com.medici.app.services.WebServiceBean true   java2ws     

WSDL 2 Java通过使用’wsdl2java’目标配置cxf-codegen-plugin,从WSDL文档生成Java客户端。

‘-p’参数指定包类。

生成的类将放在target / generated-sources / cxf文件夹中。

  org.apache.cxf cxf-codegen-plugin 2.5.1   process-sources generate-sources    ${project.build.directory}/wsdl/WebService.wsdl  -p com.medici.app.client.model      wsdl2java