2012-01-31 14 views
7

私が達成したいかの小さな例です:複数のMavenアーティファクトの上にXSDファイルを配布し

のMavenアーティファクトAは、多くのウェブサービスの一つであり、要求および応答のための 定義をXSDスキーマを定義します。 (src/main/resources/xsd)

アーティファクトAは単純なJARプロジェクトであり、低レベルのタイプ記述を持つ多数のマスターXSDを含む を含んでいます。私は実際にどのようにお知りになりたいすべての可能性の場合は一度アーティファクトB.

で を指定している(SRC /メイン/リソース/ XSD)

アーティファクトA内のXSDは、型定義を使用する(含まれます) maven依存関係としてロードされたjarにあるxsdファイルと、NetbeansやEclipseのようなIDEのwebservice xsd(およびwsdl)を解決する方法が含まれています。

このアプローチがエキゾチックなようであれば、クリーンなデザインの方が良いでしょうか?ここ

まず

更新は、私は、スキーマは仕事に含ま期待方法の簡単な例です....

Artifact A (WAR Module) 
POM: 
... 
<artifactId>A</artifactId> 
... 
<dependency> 
    <artifactId>B</artifactId> 
    ... 
</dependency> 

Schema: 
.... 
<xs:include schemaLocation="classpath://net/elfwyn/xsd/schema.xsd"/> 
.... 

Artifact B (JAR Module) 

Schema Location: 
src/main/resources/net/elfwyn/xsd/schema.xsd 

、このような問題のために、いくつかのsollutionsがあるように思われます

(netbeans7.1)IDE(開発環境用)に組み込まれ、Mavenプラグイン(本稼働環境用)として利用可能なカタログリゾルバーの知りたいことは、 atは、スキーマファイルの場所にエイリアスを指定できる必要があります。このエイリアスは、スキーマの場所として使用されます。

しかし、JARファイル内のスキーマにアクセスするCatalog.xmlを指定する方法はわかりません。 私には、スキーマの場所で直接指定するのと同じ問題があるようです。 また、すべての可能な場合には、私がむしろ取ることのない各WARプロジェクトのカタログを維持するオーバーヘッドがあります。

Mavenプラグインについてはまだ決定的なものは見つかりませんでした。

その他sources

は、JAX-B、 のコンテキストでカスタムカタログリゾルバを実装しているが、私はまだJavaの-WS環境で、このようなリゾルバを実装するための可能なフックを見ることができない、それはと連携して動作するはずですか上記のmaven-pluginまたはIDEカタログリゾルバを参照してください。

答えて

6

あなたの質問は妥当だと思います。過去に私は、依存JARにあるファイルに対して特別な処理を行う必要があるMavenモジュールを持っていることがよくありました。

私が過去に行ってきたことは、次のようにアーティファクトBアーティファクトAの依存関係が続いてアーティファクトAIののpom.xmlにMavenの依存関係のプラグインの特別な設定を使用することです:

<plugin> 
    <!-- Used to pull XSD files from the JAR --> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
      <execution> 
       <id>unpack-xsd-files</id> 
       <!-- Using the initialize phase because it is before the generate sources phase --> 
       <phase>initialize</phase> 
        <goals> 
         <goal>unpack</goal> 
        </goals> 
        <configuration> 
         <artifactItems> 
          <artifactItem> 
           <!-- Artifact that Holds our custom templates --> 
           <groupId>com.mycorp</groupId> 
           <artifactId>artifact-b</artifactId> 
           <version>${artifact-b.version}</version> 
           <type>jar</type> 
          </artifactItem> 
         </artifactItems> 
         <includes>**/*.xsd</includes> 
         <outputDirectory>${project.basedir}/target/xsd-includes</outputDirectory> 
        </configuration> 
      </execution> 
    </executions> 
</plugin> 

対象のXSDファイルはArtifact Aのターゲットディレクトリにあり、そこからあなたが望むものを何でも実行できます。それらをリソースとして、他のXSDファイルから参照したり、自分のJARなどに埋め込んだりすることができます。設定からわかるように、ターゲットディレクトリにそれらを置く必要もありません。 /src/main/resourcesディレクトリに直接入れることができます。

複数のモジュールがすべて同じ方法で動作できるように、この設定を任意のMavenモジュールに追加できます。このアプローチの素晴らしい点は、EclipseからM2Eclipse経由でも動作することです。

+0

私はまだあなたの解決策を確認するための時間がなかったが、それは非常に合理的と賞金がすぐに使い果たされるように私は正しい答えとしてこれを取る。ありがとうございました! – elfwyn

+0

@Stefan - 問題が発生した場合は、ここにコメントを残しておいてください。 – HDave

+0

これを 'initialize'に束縛すると、' target'ディレクトリがまだ存在しないことがあります。私はまた、Eclipseで大きな問題を抱えていましたが( 'mvn:compile'も使用しています)、恐ろしい'ソースはディレクトリの5年目のバグであってはいけません。それが一番きれいなソリューションなので+1してください。 – artbristol

関連する問題