web-dev-qa-db-ja.com

wsimport-別々のプロジェクト/フォルダーでサービスエンドポイントクラスとJAXBクラスを生成する方法

複数のWebサービス(複数のWSDL)を使用するプロジェクトにはトップダウンアプローチを使用しています。各Webサービスは、個別のプロジェクトとしてセットアップし、個別の戦争として展開する必要があります。

問題は、WSDLがいくつかの一般的な.xsdファイルを共有していることです。現在、WSDLごとにwsimportを実行すると、共通のJAXBクラスが各Webサービスプロジェクトで複製されます。

理想的には、共通の共有プロジェクトでJAXBクラスを個別に生成してから、各WebサービスプロジェクトでJAXBクラスプロジェクトを再利用する必要がありますが、wsimportにはJAXBクラスの生成をスキップするオプションがありませんOR JAXBクラスの別の場所を指定します。

異なるJAX-WSWebサービスエンドポイント間でJAXBクラスを共有する方法について何か考えはありますか?

11
PrasadB

この質問は非常に古いことは知っていますが、探している人のために答えを共有したいと思いました。答えを見つけるのに時間がかかったのはわかっています。

JAXB 2.1 RIの時点で、これを容易にするために使用できる「エピソード」と呼ばれる機能があります。

Myschema.xsdというスキーマがあるとしましょう。次に、次のように呼び出します。

xjc -episode myschema.episode myschema.xsd

これは、1回の呼び出しで複数のxsdファイルをコンパイルする場合にも機能します。この呼び出しにより、バインディングとmyschema.episodeファイルが生成されます。

エピソードファイルは特別なバインディングファイルです。次に、次のように、このファイルをwsimportで使用できます。

wsimport mywsdl.wsdl -b myschema.episode

wsimportは、以前に生成されたJAXBファイルを使用するようになり、欠落しているものはすべて生成されます。

詳細については、 このページ を参照してください。

14
Brian Schrameck

これは、 [〜#〜] jaxb [〜#〜] / JAX-WS カスタマイズを使用して実現できます。 XSDタイプがWSDLに埋め込まれていると仮定します。次に、カスタマイズは次のようになります。

<jaxws:bindings version="2.0"
    xmlns:jaxws="http://Java.Sun.com/xml/ns/jaxws"
    xmlns:jaxb="http://Java.Sun.com/xml/ns/jaxb"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    wsdlLocation="../wsdl/some.wsdl">

    <jaxws:package name="org.company.project.ws" />

    <!-- XSD types customization within WSDL -->
    <jaxb:bindings node="//xsd:schema">
        <jaxb:schemaBindings>
            <jaxb:package name="org.company.project.beans" />
        </jaxb:schemaBindings>
    </jaxb:bindings>
</jaxws:bindings>

上記の構成は、次のプロジェクトディレクトリ構造を参照しています。

+-- binding
|   +-- jaxws-binding.xml
+-- wsdl
|   +-- some.wsdl
+-- src
    ...

org.codehaus.mojo:jaxws-maven-pluginプラグインを使用する場合は、<bindingDirectory>binding</bindingDirectory>を指定する必要があります。

XSDがWSDLの外部にある場合は、カスタマイズを個別に指定する必要があります。

+-- binding
|   +-- jaxb-binding.xml
|   +-- jaxws-binding.xml
+-- wsdl
    ...

すると、jaxb-binding.xmlは次のようになります。

<jaxb:bindings version="1.0"
    xmlns:jaxb="http://Java.Sun.com/xml/ns/jaxb"
    xmlns:xjc="http://Java.Sun.com/xml/ns/jaxb/xjc"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <jaxb:bindings schemaLocation="my.xsd" node="//xsd:schema">
        <jaxb:schemaBindings>
            <jaxb:package name="org.company.project.beans" />
        </jaxb:schemaBindings>
    </jaxb:bindings>
</jaxb:bindings>
  • Antビルドの場合、異なるパッケージ用に2つのjarを生成するだけです。
  • 私は個人的に1つのMavenプロジェクトから2つのJARアーティファクトを作成する方法を知らないので:)最も簡単な解決策は、project-beansプロジェクトとproject-wsプロジェクトでXSDからJAXBクラスを生成することです。 wsimportの実行後にJAXBクラスを生成しました(そのためにantプラグインを使用できます)。
7
dma_k

通常、IBMRationalツールセットを使用して見たものは次のとおりです。

すべてのJAXBおよびサービスクラスを生成し、それらをサービスプロジェクトに保存します。次に、JAXBとサービスクライアントクラスを再生成し、クライアントプロジェクトに保存します。

はい、これは重複です。しかし、その背後にある理由は、サービスプロバイダーとサービスコンシューマーの懸念を分離しているためだと思います。ツールセットの観点から、クライアントが.NET、C++、またはJavaのいずれであるかをどのようにして知ることができますか?またはその逆。クライアントの場合、プロバイダーが.NET、C++、またはJavaなどであるかどうかをどのようにして知ることができますか?あなたはしません。したがって、IBMは、関心の分離のこの方法を提供します。

これの欠点は、サービスプロバイダーとコンシューマーの両方のソースがある場合、コードが重複していることです。これは維持するのが面倒な場合があります。

したがって、サービスとクライアントをJavaプロジェクト(J2EEプロジェクトやWebプロジェクトではない)に生成し、それからjarを作成するのがおそらく最善でしょう。このようにして、すべてのJAXBクラスはそこにあります(そして1回だけです)WSDLはそこにあります(1回)サービスは一度そこにあり、EARまたはWARのいずれかでサーバーにデプロイできますそしてクライアントはそれを誰かに与えたい場合に備えて存在しますクライアントがWSDLの場所に基づいた動的な作成を許可している場合は、さらに優れています。

私は 役立つかもしれない投稿 ウィザード主導の観点からそれを持っています。これはセキュリティに関連していますが、そこからいくつかの役立つヒントが見つかるかもしれません。

1
Chris Aldrich

Mavenを使用している場合は、プラグインを使用してそれを行うことができます。
JAXB XJC Maven 2プラグインの使用

0
cgalleguillosm