2012-10-09 65 views
2

我使用XJC從HTNG Payment Systems模式生成Java類,可在this zip的/ schemas目錄中找到。爲什麼更改傳遞給XJC的包名稱會中斷JAXB生成?

如果我不通過-p參數運行XJC,代做工精細,和類的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插件。

有人可以解釋爲什麼會發生這種情況嗎?是否有辦法用XJC解決這個問題?我覺得如果JAXB通過第一種方法工作,它應該通過第二種方法工作,因爲所有需要完成的操作都是對包名進行簡單的String替換。我想我可以使用第二種方法,並通過一個.xjb綁定文件來處理所有的碰撞,但考慮到錯誤的數量,這將是單調乏味的。

回答

3

當我運行

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

我得到了兩套生成的類,一個名爲generated包和其他在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 
+0

謝謝,你是對的!我忽略了/生成的文件夾中的代碼(或者可能錯誤地認爲它是中間的工件)。 –

相關問題