2

XJCを使用して、このzipの/schemasディレクトリにあるHTNGPaymentSystemsスキーマからJavaクラスを生成しています。

パラメータを渡さずにXJCを実行すると、生成は正常に機能し、クラスはパッケージ-pの下で生成されます。org.htng._2009b

$ cd schemas
$ xjc -mark-generated -no-header -target 2.1 -npa .

私がやりたいのは、生成されたクラスのパッケージ名を、よりプロジェクトに適したものに変更することですcom.justin.htng

$ cd schemas
$ xjc -mark-generated -no-header -target 2.1 -npa -p com.justin.htng .

ただし、これを行うとJAXB生成が見事に中断され、ほとんどすべての要素で衝突エラーが発生します。最初のメソッドを介してクラスを生成し、それらをパッケージにリファクタリングすることでこれを回避できcom.justin.htngますが、それはあまり保守可能ではなく、maven-jaxb2-pluginにうまく移植されません。

誰かがこれが起こっている理由と、XJCでそれを回避する方法があるかどうかを説明できますか? JAXBが最初の方法で機能する場合は、2番目の方法でも機能するはずです。これは、パッケージ名を単純な文字列に置き換えるだけでよいためです。2番目の方法を使用して、.xjbバインディングファイルを介してすべての衝突を処理できると思いますが、エラーの数を考えると、それは面倒です。

4

1 に答える 1

3

私が走るとき

xjc -mark-generated -no-header -target 2.1 -npa .

生成されたクラスの 2 つのセットを取得します。1 つは という名前のパッケージにgeneratedあり、もう1 つは にありますorg.htng._2009bHTNG_CommonTypes.xsdスキーマには がないため、targetNamespace直接コンパイルすると、その型がgeneratedパッケージに含まれます。しかし、 を宣言するHTNG_CommonTypes他のスキーマによってもインポートされますtargetNamespace。一般的なタイプがインポートされたケースでコンパイルされると、org.htng._2009b.

-pにオプションを指定すると、すべてxjcの名前空間の名前空間からパッケージへのマッピングがオーバーライドされるため、名前空間を持つ型と名前空間を持たない型の両方が同じパッケージにマップされるため、名前が衝突します。

ここでの正しい解決策は、CommonTypesスキーマを個別にコンパイルするのではなく、スキーマをインポートするものだけをコンパイルすることだと思います。以下は私にとってはうまくいきます:

xjc -mark-generated -no-header -target 2.1 -npa -p com.justin.htng HTNG_P*.xsd
于 2012-10-09T16:33:39.987 に答える