Mavenを使用してクライアントを生成するのに苦労しています。したがって、私の質問の最初の部分については、 ソースから直接Webサービスクライアントを作成する を参照してください。
シンプルで短くするために、ここから移動します(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の両方を使用し、これを実現するためにいくつかのトリッキーな構成を使用します。
これを行っているのと同じプロジェクトで生成されたスタブを使用しようとしないと仮定すると(循環依存関係が作成され、悪い考えになります...)、はい、次のようなことができます。
設定はそれほどトリッキーではありません。実際、あなたは質問でそれを推測したと思いますが、ここに行きます:
<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>
Update-生成されたコードを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が最新のようです。
私も同じプロセスで成功しました。目的は、アプリケーションのWebサービス用のWebサービスプロキシJARを作成することです。
アプリケーションには3つのWebサービスがあります(現在)。これらは、サービスとサポートクラスを使用してWARを構築するMavenプロジェクトによって作成されます。このプロジェクトには、Sun-jaxws.xml
記述子とweb.xml
が含まれています。
WebサービスMavenプロジェクトはマルチプロジェクトビルドの一部であるため、WebサービスWARはEAR内の1つのモジュールであり、EJB JAR、ユーザーインターフェイスWAR、その他のJAR(および依存関係)もあります。
理想的には、WebサービスWARプロジェクトに依存し、MavenJAX-WSプラグインの目標wsgen
に続いてwsimport
を使用して作業を行う別のMavenプロジェクトでクライアントプロキシJARを作成します。
しかし、MavenプロジェクトでWARを依存関係として使用して、そのクラス(WEB-INF/classes
内)をクラスパスに追加することはできませんでした。 AppFuse Warpathプラグイン を試しましたが、WAR依存関係を解凍できませんでした。
結局、1つのMavenプロジェクトで複数のアーティファクトを構築してインストールすることに頼らざるを得ませんでした。 wsgen
とwsimport
および2番目のアーティファクトに関する私の調査結果:
jaxws-maven-plugin
は、現在のプロジェクトの外部にある場合はwsgen
ゴールに独自の依存関係を必要とします。そうでない場合、それらを見つけることができません。 (verbose
がtrue
に設定されている場合でも、この目標はほとんど役立つ情報を出力しません。)wsgen
ゴールを呼び出す必要があります。wsimport
ゴールは、サービスが多数のサポートクラスを共有するため、すべてのWSDLで一度に呼び出されます。 (生成されたすべてのクラスは1つのクライアントプロキシパッケージに入るため、異なるパッケージで作成された場合でも、元のソース間でクラス名が重複しないことが重要です。)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>
Wsgen、wsimport、wsgen、wsimportの順に実行すると、必要なことが達成されますが、Mavenではモジュールを2回ビルドすることはできません。これを回避するには、mavenをant execタスクとして実行します。このタスクは、ビルドサイクルの検証フェーズに接続された現在のディレクトリにmvninstallをビルドします。これにより、wsimport、次にwsgenが実行され、ビルドが検証サイクルを超えて続行されると、wsimport(現在は新しく作成されたwsgenで)が再実行され、次にwsgenが再度実行されます。これにより、同じMavenモジュールに組み込まれたWebサービスとそのサービスを使用するWebクライアントを使用できます。次のプラグイン宣言をmavenpom.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>