2

我正在使用 XJC 从 HTNG 支付系统模式生成 Java 类,该模式位于此 zip的 /schemas 目录中。

如果我在不传递参数的情况下运行 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 通过第一种方法工作,它应该通过第二种方法工作,因为需要做的只是对包名称进行简单的字符串替换。我想我可以使用第二种方法并通过 .xjb 绑定文件处理所有冲突,但考虑到错误的数量,这将是乏味的。

4

1 回答 1

3

当我跑

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

我得到两组生成的类,一组在名为的包中generated,另一组在org.htng._2009b. HTNG_CommonTypes.xsd模式没有,所以当targetNamespace它直接编译时,它的类型最终会出现在generated包中。但是HTNG_CommonTypes也被其他模式导入,这些模式确实声明了targetNamespace. 当通用类型在导入的案例中编译时,它们最终以org.htng._2009b.

现在,如果您指定-p选项 to ,它将覆盖所有xjc命名空间的命名空间到包的映射,因此命名空间和非命名空间类型都映射到同一个包,因此名称冲突。

我怀疑这里的正确解决方案根本不是CommonTypes独立编译模式,而只是编译导入它的模式。以下对我有用:

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