哪个是生成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