6

私は2つのスキーマA、Bを持っています.BでいくつかのA要素を再利用しています.

名前空間は使用しません。

私は使用しています

<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.9.0</version>

スキーマ B にスキーマ A を含めることを次のように定義しました。

<xs:include schemaLocation="classpath:my.schema.A.xsd"/>

とカタログとして

REWRITE_SYSTEM "classpath:my.schema.A.xsd" "maven:my.schema:schema-a!/A.xsd"

jaxb 構成は次のようになります。

<configuration>
    <generatePackage>my.schema.b</generatePackage>
    <schemaIncludes>
        <includes>B.xsd</includes>
    </schemaIncludes>
    <episodes>
        <episode>
            <groupId>my.schema</groupId>
            <artifactId>schema-a</artifactId>
        </episode>
    </episodes>
    <catalog>src/main/catalog/catalog.cat</catalog>
</configuration>

問題は、エピソードの依存関係を指定するたびに、クラスを生成したい B 要素が含まれているにもかかわらず、スキーマがクラスを生成しないことです。

[INFO] Parsing input schema(s)...
[INFO] Compiling input schema(s)...
[INFO] Cleaning package directories.
[INFO] Finished execution.

エピソードを削除すると、うまく機能し、スキーマ A のクラスも生成されます。これは実際に避けたいと思います。

何か提案はありますか?

サンプルはJaxb エピソード編集で公開されました

4

2 に答える 2

5

わかりました、私はあなたの例をチェックしました。問題は、名前空間を使用しないことです。

META-INF/sub-jaxb.episodeファイルを確認します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings version="2.1" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
  <jaxb:bindings scd="x-schema::">
    <jaxb:schemaBindings map="false">
      <jaxb:package name="schema.episode.a"/>
    </jaxb:schemaBindings>
    <jaxb:bindings scd="person">
      <jaxb:class ref="schema.episode.a.Person"/>
    </jaxb:bindings>
  </jaxb:bindings>
</jaxb:bindings>

あなたはこれを見て<jaxb:bindings scd="x-schema::">、次に<jaxb:schemaBindings map="false">. これは基本的に、「空の名前空間には何もマップしない」ことを XJC に伝えます。2 番目のスキーマ ( b.xsd) も名前空間を使用しないため、a.xsdのエピソード ファイル (上記のバインド) を使用すると、コードの生成も抑制さb.xsdれます。

要約すると、エピソード/個別のスキーマ コンパイルを使用する場合、1 つの名前空間を持つスキーマを別のエピソードに配置することはできません。これはまさに の問題includeです。

これは のバグではありませんmaven-jaxb2-plugin。私はそれを XJC のバグとは呼びません。これは、エピソードがデフォルトでどのように機能するかです。

ここで私のプル リクエストを参照してください。名前空間が適切に処理されるときのエピソード コンパイルを示しています。

于 2014-09-11T07:44:16.953 に答える
0

ここの作者maven-jaxb2-plugin

私の推測では、あなたのエピソードは「名前空間 A と B をコンパイルしないでください」のようなことを言っていると思います。META-INFJAR内のバインド ファイルを確認してください。

これはかなり高度な使用法であり、これがうまくいかない可能性のあるポイントがかなりあります。あなたが使う:

  • カタログ
  • Maven アーティファクト ベースのスキーマ解決
  • エピソード

カタログとエピソードは XJC 機能であり、Maven の解像度はmaven-jaxb2-plugin. 失敗したものを選び出すようにする必要があります。

  • エピソードだけで試してみてください - スキーマを抽出し、カタログとリゾルバーなしで「そのまま」コンパイルします
  • カタログのみ - スキーマを抽出し、代わりにローカルディレクトリに書き換えますmaven:
  • maven:my.schema:schema-a!/A.xsdエピソードとカタログのないスキーマの場所として試す

明らかに、試してみる別の 3 つの組み合わせ。

サンプル プロジェクトを提供していただければ、調査いたします (ただし、今後 10 日以内ではありません)。最善の方法は、問題を報告することです。プラグインを GitHub に移動するので、これが適切な場所になります。

https://github.com/highsource/maven-jaxb2-plugin

于 2014-09-08T17:11:49.903 に答える