4

ベンダーから入手した wsdl を使用する実装に取り​​組んでいます。私たちのプロジェクトは Spring と CXF で実行されており、このベンダーの wsdl サービスにアクセスできるようにする jar を作成したいのですが、クラスパスの問題が発生しています。

CXF の wsdl2java を使用すると、次のようなコードを生成できます。

WSDL_LOCATION = new URL("file:SomeService.wsdl");

このサービスでは wsdl がクラスパスにある必要がありますが、スタンドアロンの jar として配布できるように jar にバンドルしたいと考えています。wsdl2java ツールを使用すると、URL のインスタンス化で任意の文字列を指定できます。ただし、機能するjar内のカスタム文字列とwsdlファイルの場所の組み合わせは見つかりませんでした。

これを希望どおりに機能させる唯一の方法は、wsdl ファイルを SomeService.class と同じフォルダーに置き、次の行を使用することです。

WSDL_LOCATION = TrackService.class.getResource("TrackService_v4.wsdl");

ただし、これには、Java コードを手動で編集して自分でコンパイルする必要があるという欠点があります。最終的にはこのプロセスを Maven ビルドの一部にし、wsdl2java に生成とコンパイルを自動的に実行させたいため、これは望ましくありません。

wsdl が jar 内のどこにあっても問題ありませんが、jar 内のファイルを参照するために wsdl2java に何を渡せばよいかわかりません。

誰にもこれを行う提案や経験はありますか?

4

3 に答える 3

3

クラスパス wsdl の場所を次のように指定して、ClassLoader を使用してこの wsdl をクラスパス リソースとしてロードするスタブを生成する必要があります。

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>2.4.3</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-bindings-soap</artifactId>
            <version>2.4.3</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <configuration>
                <sourceRoot>${project.build.directory}/generated-sources/cxf
                </sourceRoot>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdl>${basedir}/yourWSDL.wsdl</wsdl>
                        <extraargs>
                            <extraarg>**-wsdlLocation**</extraarg>
                            <extraarg>**classpath:yourWSDL.wsdl**</extraarg>
                        </extraargs>
                    </wsdlOption>
                </wsdlOptions>
            </configuration>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
        </execution>
    </executions>
</plugin>
于 2012-10-24T10:11:30.510 に答える
3

同じ問題に遭遇しました。次の回避策がありますが、まだクリーンなものを探しています。

  1. wsdl を src/main/resources/wsdl に保存します

  2. TrackService を作成するときは、次の手順を実行します。

    URL wsdlUrl = TrackService.class.getResource( "/wsdl/TrackService_v4.wsdl" ); TrackService service = new TrackService( wsdlUrl );

<wsdlLocation/>理想的な解決策は、場所を要素として CXF wsdl2java プラグインに渡すことです。次に、クライアント コードで既定のコンストラクターを呼び出すことができます。ただし、生成されるスタブ コードでは、クラスパスにある wsdl ファイルを指定できません。

于 2011-02-25T14:46:00.227 に答える