1

私は現在、Maven の jaxws-maven-plugin を使用して Web サービス クライアントの生成を自動化するプロジェクトに取り組んでいます。現在、Web サービス クライアントは、Web サービス クライアント生成用の IBM RAD 8.0 内部ツールを使用して生成されます。

これは問題なく機能しますが、Web サービスの数が増えると、プロセスが非常に遅くなります。Maven プラグインを取得してクライアント プロジェクトで Java クラスを生成し、それらをローカル サーバーでのローカル開発に使用することはできますが、デプロイしようとすると Web サービスの検証に失敗します。これは、各サーバーでテストが正常に実行されたときに、プロジェクトがテスト サーバー、ステージング サーバー、および運用サーバーをさらに展開する必要があるサーバー インフラストラクチャによるものです。

デプロイ時に、Websphere Portal Server は、生成された Web サービス クライアントを、パッケージで生成されたバインディング Java ファイルで指定された WSDL 定義に対して検証しようとします。Maven プラグインを実行すると、次のバインドが生成されます。

MyProjectHttpService

 static {
    URL url = null;
    WebServiceException e = null;
    try {
        url = new URL("http://localhost:9080/MyProjectWeb/sca/MyProjectExportWS?wsdl");
    } catch (MalformedURLException ex) {
        e = new WebServiceException(ex);
    }

生成された Web プロジェクトは、まったく同じ EAR ファイルから各サーバーで実行する必要があるため、サーバー間で WSDL ファイルの URL を変更することはできません。

RAD のインポート ツールは、クラスローダーを使用してファイルを取得するバインディング ファイルを生成します。

MyProjectHttpService

static {
    URL url = null;
    try {
        url = com.my.package.portal.MyProjectHttpService.class.getResource("/WEB-INF/wsdl/project/interfaces/MyProjectExport1.wsdl");
        if (url == null) throw new MalformedURLException("/WEB-INF/wsdl/project/interfaces/MyProjectExport1.wsdl does not exist in the module.");
    } catch (MalformedURLException e) {
       ...
    }

解決策を見つけるために、XSD ファイルと WSDL ファイルをダウンロードしてビルド パッケージに入れる独自の Maven プラグインを作成するところまで行きました。それ以外の 。ただし、バインディング ファイルが絶対パスで生成されるため、これも成功しませんでした。

 static {
    URL url = null;
    WebServiceException e = null;
    try {
        url = new URL("file:/D:/mavenworkspace/testproject/target/META-INF/wsdl/com/my/package/portal/ws/interfaces/MyProjectExport1.wsdl");
    } catch (MalformedURLException ex) {
        e = new WebServiceException(ex);
    }
  }

問題を解決する方法についてのヘルプは大歓迎です。すべての XSD ファイルと WSDL ファイルを jar 内に格納し、相対的に参照するという結果をどのように達成できるかはあまり気にしません。そのため、Web サーバーが Web サービス クライアントを検証しようとするときに環境は問題になりません。

PS: 残念ながら、異なる環境に複数のプロファイルを使用することもできません。

4

1 に答える 1

0

いくつか試した後、ようやく問題を解決することができました。このブログ投稿 (およびそこにリンクされているもの) によって正しい軌道に乗ってきました: http://blog.vinodsingh.com/2008/12/locally-packaged-wsdl.html

最終的に、新しい Maven プラグインと wsimport プラグインの使用を組み合わせたカスタム ソリューションになりました。当社独自のプラグインは、特定の URL のすべての .wsdl および .xsd ファイルをダウンロードすることによって、いくつかの準備作業を行います。コードを共有することは許可されていませんが、プラグインがどのように機能するかについていくつかのヒントを提供したいと思います.

これは、Web サービス クライアントになるプロジェクトの pom ファイルのビルド部分です。

<build>
    <plugins>
        <plugin>
            <groupId>com.my.company</groupId>
            <artifactId>wsdl-import</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <executions>
                <execution>
                    <goals>
                        <goal>wsdlimport</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <wsdlUrls>
                    <wsdlUrl>http://serveraddress/MYWEBSERVICEMODULE/WEBSERVICe?wsdl</wsdlUrl>
                </wsdlUrls>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.jvnet.jax-ws-commons</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <target>2.1</target>
                <keep>true</keep>
            </configuration>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>wsimport</goal>
                    </goals>
                    <configuration>
                        <wsdlLocation>/wsdl/com/my/company/WEBSERVICEEXPORT.wsdl</wsdlLocation>
                        <wsdlUrls>
                            <wsdlUrl>${project.build.directory}/META-INF/wsdl/com/my/company/WEBSERVICEEXPORT.wsdl</wsdlUrl>
                        </wsdlUrls>
                    </configuration>
                </execution
            </executions>   
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>${project.build.directory}/META-INF/</directory>
        </resource>
    </resources>
</build>

私たちのプラグイン wsdlimport は、wsimport プラグインと同様に構築されています。タグ内に一連の WSDL ファイルを使用します。各 wsdl ファイルがダウンロードされ、結果のドキュメントが XPath を使用して解析されます。「xsd:import」要素または「xsd:include」要素のいずれかである XML ノードごとに、スキーマの場所のパスが抽出され、(他の) XSD ファイルを含む追加のノードについて解析されます。注意する必要があるのは、単純型ではない他の要素を参照するノードです。

<xsd:element maxOccurs="unbounded" minOccurs="0" name="persons" type="bons1:BOPerson">
<xsd:element maxOccurs="unbounded" minOccurs="0" name="names" type="xsd:string">

このような要素には、xsd 名前空間にある単純型とは別の名前空間があります。私たちの場合、BO 用のカスタム名前空間 bons1 と bons2 (BO-名前空間 1 と 2 だと思います) があります。

プラグインは、すべての wsdl ファイルをターゲット ディレクトリの "META-INF/wsdl/packagepath/" フォルダーに配置するように構成されています。

その後、通常の wsimport プラグインが引き継ぎます: パス "/wsdl/packagepath/" を指すように定義します (上記と同様ですが、META-INF はありません)。wsdlUrl として、ダウンロードした WSDL ファイルへのローカル パスを指定します。これにより、Java 実装が生成されます。

最後に、ダウンロードして生成したファイルを機能させるには、META-INF フォルダーをリソースとして定義して、出力 .jar ファイルにバンドルされるようにする必要があります。META-INF フォルダーを定義することにより、.jar のルート ディレクトリにある "/wsdl" で WSDL ファイルと XSD ファイルがパッケージ化されます。そのため、"/META-INF/wsdl/packagepath/..." ではなく "/wsdl/packagepath/..." と定義しました。

これが将来同様の問題を解決するのに役立つことを願っています。

于 2013-01-31T12:22:25.843 に答える