web-dev-qa-db-ja.com

jaxws-maven-pluginを使用したJAX-WS wsdlLocation属性値(絶対パス)の制御

JAX-WS駆動のWebサービスがあり、そのWSDLは別のMavenモジュール(ws-consumerと呼びます)からWebサービスクライアントを生成します。

良くも悪くも、「公開されたWSDL」(サービスがリリースの時点で保持/生成したバージョンのWSDLおよびXSD)をsrc/wsdlws-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または他の値に設定することでこれを「制御」できる方法はありますか?

20
Alex

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を明示的にプロビジョニングすることもできます。その場合、このプロパティは無視されますが、コンテナ管理のアプリケーションでは適切でない場合があります。

サンプルコード ここ

13
McDowell

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>
7
Dean Schulze

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.
0
Guillaume Husta