我很难使用maven来生成我的客户端。所以请在问题的第一部分参考Creating a web-service client directly from the source。
为了保持简单和简洁,我想从这里开始(src / main / java中的文件):
package com.example.maven.jaxws.helloservice;
import javax.jws.WebService;
@WebService
public class Hello {
public String sayHello(String param) {
; return "Hello " + param;
}
}
到那里:
/**
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.1.7-b01-
* Generated source version: 2.1
*
*/
@WebServiceClient(name = "HelloService", targetNamespace = "http://helloservice.jaxws.maven.example.com/", wsdlLocation = "http://localhost:8080/test/")
public class HelloService
extends Service
{
private final static URL HELLOSERVICE_WSDL_LOCATION;
private final static Logger logger = Logger.getLogger(com.example.wsimport.HelloService.class.getName());
...etc
仅使用1个pom.xml文件。
请注意最后设置的wsdlLocation。 pom.xml文件可能会使用maven-jaxws-plugin wsgen和wsimport以及一些棘手的配置来实现这一点。
答案 0 :(得分:17)
假设你不会尝试在你正在做的同一个项目中使用生成的存根(这将创建循环依赖并且是一个坏主意......)然后,是的,你可以做像这样的东西。
配置并不是那么棘手,实际上你在你的问题中猜到了它,但是这里有:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<executions>
<execution>
<id>generate-wsdl</id>
<phase>process-classes</phase>
<goals>
<goal>wsgen</goal>
</goals>
<configuration>
<sei><!-- fully qualified class name goes here --></sei>
<genWsdl>true</genWsdl>
</configuration>
</execution>
<execution>
<id>generate-stubs</id>
<phase>process-classes</phase>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlDirectory>target/jaxws/wsgen/wsdl</wsdlDirectory>
<wsdlFiles>
<wsdlFile><!-- class name goes here -->Service.wsdl</wsdlFile>
</wsdlFiles>
<!-- *** you need the next line to set the wsdlLocation in the generated stubs *** -->
<wsdlLocation>http://localhost:8080/test</wsdlLocation>
</configuration>
</execution>
</executions>
</plugin>
更新 - 将生成的代码打包到jar中我会像maven-jar-plugin那样使用:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>package-wsclient-jars</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classesDirectory>target/jaxws/<!-- rest of the path here, can't remember it right now --></classesDirectory>
<classifier>wsclient</classifier>
</configuration>
</execution>
</executions>
</plugin>
我很快就从配置中粘贴了这个,但我们的用法有点不同(因为我们压缩了wsdl文件而不是生成的客户端,但我相信这会让你非常接近)。如果你还没有使用它,你可能需要设置maven-jar-plugin的版本 - 2.3.1似乎是最新版本。
答案 1 :(得分:5)
我在同一个过程中取得了成功。目的是为我们的应用程序中的Web服务创建Web服务代理JAR。
我们的应用程序中有三个Web服务(目前)。它们由Maven项目创建,该项目使用服务和支持类构建WAR,其中包含sun-jaxws.xml
描述符以及web.xml
。
Web服务Maven项目是多项目构建的一部分,因此Web服务WAR是EAR中的一个模块,它还具有EJB JAR,用户界面WAR和其他JAR(以及依赖项)。
理想情况下,我会在另一个依赖于Web服务WAR项目的Maven项目中创建客户端代理JAR,并使用Maven JAX-WS插件目标wsgen
后跟wsimport
来完成工作。
但是我无法让Maven项目使用WAR作为依赖关系,以便将其类(在WEB-INF/classes
中)添加到类路径中。我尝试了AppFuse Warpath plugin但无法解压缩WAR依赖。
最后,我不得不求助于在一个Maven项目中构建和安装多个工件。我对wsgen
和wsimport
以及第二件神器的发现:
jaxws-maven-plugin
如果它们在当前项目之外,则需要自己的wsgen
目标依赖项,否则无法找到它们。 (即使verbose
设置为true
,此目标也会发出一些有用的信息。)wsgen
目标以生成WSDL。wsimport
目标,因为这些服务共享许多支持类。 (因为所有生成的类都进入一个客户端代理包,所以不要在原始源中重叠类名,即使它们来自不同的包。)maven-jar-plugin:jar
和maven-install-plugin:install-file
打包并安装客户端代理JAR。以下是POM的关键部分,并附有一些评论:
<parent>
<groupId>lighthouse.navigate</groupId>
<artifactId>navigate</artifactId>
<version>3.9.0-SNAPSHOT</version>
</parent>
<artifactId>navigate-webservice</artifactId>
<packaging>war</packaging>
<name>Navigate WebService</name>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>navigate-util</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<!-- snip -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<!-- WSDLs must be generated for each service. -->
<execution>
<id>generate-client-wsdl</id>
<phase>process-classes</phase>
<goals>
<goal>wsgen</goal>
</goals>
<configuration>
<sei>nav.ws.client.ClientWebService</sei>
<genWsdl>true</genWsdl>
</configuration>
</execution>
<execution>
<id>generate-licence-wsdl</id>
<phase>process-classes</phase>
<goals>
<goal>wsgen</goal>
</goals>
<configuration>
<sei>nav.ws.licence.LicenceWebService</sei>
<genWsdl>true</genWsdl>
</configuration>
</execution>
<!-- snip -->
<!-- Single generation of client proxy because WSDLs share classes. -->
<execution>
<id>generate-proxies</id>
<phase>process-classes</phase>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlDirectory>target/generated-sources/wsdl</wsdlDirectory>
<destDir>target/wsgen/classes</destDir>
<packageName>nav.ws.proxy</packageName>
<xnocompile>false</xnocompile>
</configuration>
</execution>
</executions>
<!--
NB: wsgen needs its own dependencies declared so it can find
classes outside this project.
-->
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>navigate-util</artifactId>
<version>${project.version}</version>
</dependency>
<!-- snip -->
</dependencies>
</plugin>
<!-- Package client proxy JAR as secondary artifact. -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
<executions>
<execution>
<id>package-wsclient</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classesDirectory>target/wsgen/classes</classesDirectory>
<finalName>navigate-wsclient-${project.version}</finalName>
</configuration>
</execution>
</executions>
</plugin>
<!-- Install client proxy JAR as secondary artifact. -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>install-wsclient</id>
<phase>install</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<file>target/navigate-wsclient-${project.version}.jar</file>
<groupId>${project.groupId}</groupId>
<artifactId>navigate-wsclient</artifactId>
<version>${project.version}</version>
<packaging>jar</packaging>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
答案 2 :(得分:0)
运行wsgen然后wsimport然后wsgen然后wsimport将实现你需要的,但你maven不会让你构建一个模块两次。要解决这个问题,您可以将maven作为ant exec任务运行,该任务在当前目录中构建mvn install,并附加到构建周期的验证阶段。这将执行wsimport然后执行wsgen,然后当构建继续超过验证周期时,它将重新运行wsimport(现在在新创建的wsgen上),然后再次运行wsgen。这使您可以拥有一个Web服务和一个使用该服务构建在同一maven模块中的webclient。 将以下插件声明放在maven pom.xml构建文件中:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<dependencies>
<dependency>
<groupId>ant-contrib</groupId>
<artifactId>ant-contrib</artifactId>
<version>1.0b3</version>
<exclusions>
<exclusion>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<executions>
<execution>
<phase>validate</phase>
<configuration>
<tasks>
<taskdef resource="net/sf/antcontrib/antlib.xml"
classpathref="maven.plugin.classpath" />
<if>
<equals arg1="${antrunned}" arg2="yes"/>
<then>
<echo message="Good job."/>
</then>
<else>
<exec dir="${basedir}" executable="mvn" failonerror="true">
<arg value="install"/>
<arg value="-Dantrunned=yes"/>
</exec>
</else>
</if>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>