JAX-WS駆動のWebサービスがあり、そのWSDLは別のMavenモジュール(ws-consumer
と呼びます)からWebサービスクライアントを生成します。
良くも悪くも、「公開されたWSDL」(サービスがリリースの時点で保持/生成したバージョンのWSDLおよびXSD)をsrc/wsdl
のws-consumer
フォルダーにコピーし、org.jvnetのjaxws-maven-plugin
を使用して、次を使用してクライアントを生成します。 jaxws:wsimport
と以下の(切り捨てられた)構成:
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<!--phase>generate-sources</phase -->
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlDirectory>src/main/resources/META-INF/wsdl/</wsdlDirectory>
<wsdlFiles>
<wsdlFile>MyWS/MyWS.wsdl</wsdlFile>
</wsdlFiles>
</configuration>
</execution>
</executions>
</plugin>
これで、生成されたクライアントコードには、クラスレベルで次のアノテーションが適用されました。
@WebServiceClient(name = "MyWS", targetNamespace = "http://myws/blah", wsdlLocation = "**file:/C:/some/absolute/path/src/main/resources/META-INF/wsdl/MyWS/MyWS.wsdl"**)
強調鉱山
ご覧のとおり、wsdlLocation
属性値にはハードコードされた絶対パスが含まれており、サービスがデプロイされると正しくなくなります。
META-INF/wsdl/MyWS/MyWS.wsdl
または他の値に設定することでこれを「制御」できる方法はありますか?
Codehausプラグインで可能です:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>1.9</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
</execution>
</executions>
<configuration>
<keep>true</keep>
<verbose>true</verbose>
<wsdlDirectory>../wscontract/src/main/resources/wsdl</wsdlDirectory>
<wsdlLocation>wsdl/MaintainAddress.wsdl</wsdlLocation>
<sourceDestDir>src/main/Java</sourceDestDir>
<bindingDirectory>.</bindingDirectory>
<bindingFiles>
<bindingFile>jaxb/xsdbindings.xml</bindingFile>
<bindingFile>jaxb/wsdlbindings.xml</bindingFile>
</bindingFiles>
</configuration>
</plugin>
使用しているプラグインに同様のオプションがあるか、切り替えを検討することができます。
WSDLを明示的にプロビジョニングすることもできます。その場合、このプロパティは無視されますが、コンテナ管理のアプリケーションでは適切でない場合があります。
サンプルコード ここ 。
Org.jvnet.jax-ws-commonsのjaxws-maven-pluginで wsdlLocation を使用します。
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
</execution>
</executions>
<configuration>
<wsdlDirectory>src/main/resources/wsdl</wsdlDirectory>
<wsdlFiles>
<wsdlFile>arsdev.wsdl</wsdlFile>
</wsdlFiles>
<wsdlLocation>wsdl/*</wsdlLocation>
<!-- Keep generated files -->
<keep>true</keep>
<packageName>jaxws.remedy.client.generated</packageName>
<!-- generated source files destination -->
<sourceDestDir>target/generated-code/src</sourceDestDir>
</configuration>
</plugin>
org.jvnet.jax-ws-commons:jaxws-maven-pluginの場合に適しているので、@ dean-schulzeの回答に投票しましたプラグイン。
次のように、CLIを使用してローカルでヘルプを表示することも興味深い場合があります。
mvn jaxws:help -Dgoal=wsimport -Ddetail
前の回答で述べたように、ここで説明されているwsdlLocationパラメータを使用できます。
wsdlLocation
@WebService.wsdlLocation and @WebServiceClient.wsdlLocation value.
Can end with asterisk in which case relative path of the WSDL will be
appended to the given wsdlLocation.
Example:
...
<configuration>
<wsdlDirectory>src/mywsdls</wsdlDirectory>
<wsdlFiles>
<wsdlFile>a.wsdl</wsdlFile>
<wsdlFile>b/b.wsdl</wsdlFile>
<wsdlFile>${basedir}/src/mywsdls/c.wsdl</wsdlFile>
</wsdlFiles>
<wsdlLocation>http://example.com/mywebservices/*</wsdlLocation>
</configuration>
...
wsdlLocation for a.wsdl will be http://example.com/mywebservices/a.wsdl
wsdlLocation for b/b.wsdl will be
http://example.com/mywebservices/b/b.wsdl
wsdlLocation for ${basedir}/src/mywsdls/c.wsdl will be
file://absolute/path/to/c.wsdl
Note: External binding files cannot be used if asterisk notation is in
place.
-wsdllocationオプションは、JDKのwsimportコマンドにも記載されています。
しかし、それは言うだけです @ WebServiceClient javadoc を参照):
Specifies the @WebServiceClient.wsdlLocation value.