我正在使用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绑定文件处理所有冲突,但考虑到错误的数量,这将是乏味的。
答案 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