哪个是生成 Web 服务客户端的最佳 Maven 插件?
Posted
技术标签:
【中文标题】哪个是生成 Web 服务客户端的最佳 Maven 插件?【英文标题】:Which is the best maven's plugin to generate a Web Service Client? 【发布时间】:2011-04-05 00:25:16 【问题描述】:我必须生成一个 WS 客户端,但我无法决定使用哪个插件。到目前为止,我的选择是:jaxb2-maven-plugin、axistools-maven-plugin 和 jaxws-maven-plugin。
【问题讨论】:
这里 ***.com/questions/2432859/… 它说 maven-jaxb2-plugin 是不断开发和首选的。为什么不能使用 maven-jaxb2-plugin? 【参考方案1】:我使用 jaxws-maven-plugin。在我看来,JAX-WS 是 WS 的事实上的标准实现。它具有比 AXIS 更好的生成代码,并且更易于配置和实现。它支持 Maven 和 Spring。
从 pom.xml 中的 wsdl 文件生成客户端代码:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<executions>
<execution>
<id>generate-reports-ws-code</id>
<phase>generate-sources</phase>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<!-- This property is used to support having multiple <execution> elements. The plugin has, from some reason, only one timestamp file per the all executions, thus if you have two executions, it doesn't know exactly when to recompile the code. Here we tell it explicitly to have one timestamp file per each execution --> <staleFile>$project.build.directory/jaxws/stale/.staleFlag.reports</staleFile>
<packageName>com.acme.reports.ws.api</packageName>
<wsdlDirectory>$project.build.directory/wsdl</wsdlDirectory>
<wsdlFiles>
<wsdlFile>InternalReportsAPIService.wsdl</wsdlFile>
</wsdlFiles>
<verbose>true</verbose>
<sourceDestDir>$wsdl.generated.source.files.dir</sourceDestDir>
</configuration>
</execution>
</executions>
</plugin>
创建客户端服务 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 的获取请求。然后它根据自动生成的代码中的注释创建 WSDL,并对其进行比较。我相信这样做是为了确保您运行的是正确的服务器版本。 因此,我已将 url 放置在我的应用程序可访问的属性文件中,因此我在我的 Spring 应用程序上下文文件中进行了初始化。
这是一个使用工厂生成服务然后使用它的示例:
InternalReportsAPIService internalReportsAPIService = acmeReportsWSFactory.createInternalReportsAPIService();
InternalReportsAPI port = internalReportsAPIService.getInternalReportsAPIPort();
从这里,只需使用端口变量调用 wsdl 上可用的任何操作。
【讨论】:
这对我不起作用。你能把关于 wsgen 和 wsimport 的所有方面都放在你的 pom 中吗?谢谢。顺便说一句,它抱怨Original error: Could not transfer metadata org.jvnet.staxex:stax-ex/maven-metadata.xml from/to java.net (http://download.java.net/maven/1/): No connector available to access repository java.net
旧线程但只是说:JAX-WS 不是事实上的标准实现。这是标准(规范)。 JDK 中包含一个实现。另一个是CXF。一些 maven 插件使用这些工具和更多工具来生成 Web 服务客户端。【参考方案2】:
我必须生成一个 WS 客户端,但我无法决定要使用哪个插件。到目前为止,我的选择是:jaxb2-maven-plugin、axistools-maven-plugin 和 jaxws-maven-plugin。
首先,jaxb2-maven-plugin
并不是真正打算生成 WS 客户端。被淘汰了。
其次,个人I wouldn't use Axis even for client development only,所以我不建议使用axistools-maven-plugin
。被淘汰了。
这给我们留下了 JAX-WS RI 和 Apache CXF 堆栈,以及它们各自的 Maven 插件:JAX-WS Maven Plugin(可以在 Usage 页面上找到使用 JAX-WS Maven 插件的说明)和cxf-codegen-plugin.
关于利弊,我总结如下:
JAX-WS RI 包含在 Java 6 中,但文档更“粗略”(尽管 you'll find plenty of tutorials about JAX-WS RI too)。 Apache CXF 有更好的文档记录,如果您想超越规范,它可以提供更大的灵活性。最后,这两种选择都不错,所以我建议稍微浏览一下链接并发表自己的看法。
【讨论】:
JAX-WS Maven Plugin 链接已更改。 别担心,我明白了!【参考方案3】:需要 Maven 插件:
cxf-java2ws-plugin(JAX-WS 到 WSDL) cxf-codegen-plugin(WSDL 到 Java)JAX-WS 到 WSDL 通过使用“java2ws”目标配置 cxf-java2ws-plugin 从 JAX-WS 注释类生成 WSDL 文档。
将JAX-WS注解类所需的cxf-rt-frontend-jaxws依赖和项目依赖添加为插件依赖。
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-java2ws-plugin</artifactId>
<version>2.5.1</version>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>com.medici.app</groupId>
<artifactId>services</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<className>com.medici.app.services.WebServiceBean</className>
<genWsdl>true</genWsdl>
</configuration>
<goals>
<goal>java2ws</goal>
</goals>
</execution>
</executions>
</plugin>
WSDL 2 Java 通过配置带有“wsdl2java”目标的 cxf-codegen-plugin 从 WSDL 文档生成 Java 客户端。
“-p”参数指定包类。
生成的类将放在 target/generated-sources/cxf 文件夹中。
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<id>process-sources</id>
<phase>generate-sources</phase>
<configuration>
<wsdlOptions>
<wsdlOption>
<wsdl>$project.build.directory/wsdl/WebService.wsdl</wsdl>
<extraargs>
<extraarg>-p</extraarg>
<extraarg>com.medici.app.client.model</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
【讨论】:
以上是关于哪个是生成 Web 服务客户端的最佳 Maven 插件?的主要内容,如果未能解决你的问题,请参考以下文章
Asp.Net:将数据从 WCF 服务广播到 Asp.Net 客户端的最佳方式
利用IDEA创建Web Service服务端和客户端的详细过程
更改 Axis 1.4 生成的 SOAP Java 客户端的超时设置