为什么更改传递给XJC的包名会破坏JAXB生成?

时间:2012-10-09 15:10:04

标签: java xml binding jaxb xjc

我正在使用XJC从HTNG支付系统架构生成Java类,可以在this zip的/ schemas目录中找到。

如果我在没有传递-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-plugin。

有人可以解释为什么会发生这种情况,是否有办法解决XJC问题?我觉得如果JAXB通过第一种方法工作,它应该通过第二种方法工作,因为所有需要做的就是对包名称进行简单的String替换。我想我可以使用第二种方法并通过.xjb绑定文件处理所有冲突,但考虑到错误的数量,这将是乏味的。

1 个答案:

答案 0 :(得分: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指定xjc选项,则会覆盖所有命名空间的命名空间到包映射,因此命名空间和非命名空间类型都是如此get映射到同一个包,因此名称冲突。

我怀疑这里的正确解决方案不是单独编译CommonTypes模式,而只是编译导入它的模式。以下适用于我:

xjc -mark-generated -no-header -target 2.1 -npa -p com.justin.htng HTNG_P*.xsd