如何强制自定义XMLBeans生成代码的包名?
我太懂你这种闹心的感觉了——明明配置了<repackage>选项,结果XMLBeans还是自顾自生成一堆x0.x0.chepseskafModel1这种和命名空间版本绑定的包,完全不听指挥😅。先给你说清楚为什么<repackage>没用,再给你几个靠谱的解决办法:
首先,<repackage>这个选项其实是个“备胎选项”:只有当XMLBeans没法从XSD的命名空间里解析出明确包名的时候,它才会把所有生成的类塞到你指定的repackage包里。但你的情况是,XMLBeans已经根据XSD里带版本号的targetNamespace(比如类似http://chepseskaf.com/model/1这种)自动生成了x0.x0...的包结构,这时候<repackage>就完全不起作用了,它不会去覆盖已经生成的明确包结构。
那该怎么强制指定包名呢?这两个方法亲测有效:
方法一:用namespaceToPackage精准映射(最推荐)
这个方法可以直接把XSD里的每个targetNamespace,一对一映射到你想要的包名,完全不需要修改XSD内容。
你只需要在Maven插件的<configuration>里添加namespaceToPackage配置,把每个生成对应包的命名空间,映射到目标包。比如结合你的目录结构,对应的配置大概是这样:
<plugin> <groupId>org.apache.xmlbeans</groupId> <artifactId>xmlbeans</artifactId> <!-- 这里保留你的版本、executions等原有配置 --> <configuration> <namespaceToPackage> <!-- 对应生成x0.x0.chepseskafModel1的命名空间 --> <mapping> <uri>http://chepseskaf.com/model/1</uri> <package>com.chepseskaf.model.metadata</package> </mapping> <!-- 对应生成x0.x0.chepseskafModelBook1的命名空间 --> <mapping> <uri>http://chepseskaf.com/model/book/1</uri> <package>com.chepseskaf.model.metadata</package> </mapping> <!-- 对应生成x0.x0.chepseskafModelPerson1的命名空间 --> <mapping> <uri>http://chepseskaf.com/model/person/1</uri> <package>com.chepseskaf.model.metadata</package> </mapping> </namespaceToPackage> </configuration> </plugin>
如果想把所有生成的类都放到同一个包下,就把所有<mapping>里的<package>都设为同一个值;如果想分不同子包,就对应调整每个<package>的内容就行。
配置完之后,执行mvn clean compile,生成的代码就会乖乖跑到你指定的com.chepseskaf.model.metadata包下了。
方法二:修改XSD的targetNamespace(适合能改XSD的情况)
如果你的XSD是自己维护的,也可以直接修改XSD里的targetNamespace,把它改成和目标包对应的结构。比如把原来的http://chepseskaf.com/model/1改成http://chepseskaf.com/model/metadata,然后XMLBeans就会自动根据这个命名空间生成com.chepseskaf.model.metadata的包结构。
这种方法的好处是不需要额外的构建配置,但缺点是如果XSD是第三方提供的,或者不能随便修改的话,就没法用了。
最后再提醒一下
记得执行mvn clean之后再编译,不然旧的生成代码会留在目录里,容易混淆。
内容来源于stack exchange

