如何修改CXF Maven插件生成的Java类及工厂类自定义名称?
解决CXF XJC插件生成重复类/工厂类名称的问题
方案一:使用JAXB绑定文件(推荐)
通过创建绑定文件(.xjb),可以精准控制生成的Java类名称、工厂类名称,配置更灵活且无需额外依赖。
1. 创建绑定文件
为每个XSD单独创建绑定文件:
src/main/resources/bindings/A-binding.xjb:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.1"> <!-- 重命名ObjectFactory为AObjectFactory --> <jaxb:bindings schemaLocation="../schemes/A.xsd"> <jaxb:globalBindings> <jaxb:factoryClass name="AObjectFactory"/> </jaxb:globalBindings> <!-- 若XSD中有重复名称的复杂类型,可单独重命名 --> <jaxb:bindings node="//xsd:complexType[@name='CommonType']"> <jaxb:class name="ACommonType"/> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
src/main/resources/bindings/B-binding.xjb:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.1"> <jaxb:bindings schemaLocation="../schemes/B.xsd"> <jaxb:globalBindings> <jaxb:factoryClass name="BObjectFactory"/> </jaxb:globalBindings> <jaxb:bindings node="//xsd:complexType[@name='CommonType']"> <jaxb:class name="BCommonType"/> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
2. 修改POM插件配置
在每个xsdOption中添加绑定文件引用:
<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-xjc-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <id>xjc</id> <phase>generate-sources</phase> <goals> <goal>xsdtojava</goal> </goals> </execution> </executions> <configuration> <sourceRoot>${basedir}/src/main/java/</sourceRoot> <xsdOptions> <xsdOption> <xsd>${basedir}/src/main/resources/schemes/A.xsd</xsd> <packagename>com.example.A</packagename> <!-- 绑定A的配置文件 --> <bindingFile>${basedir}/src/main/resources/bindings/A-binding.xjb</bindingFile> </xsdOption> <xsdOption> <xsd>${basedir}/src/main/resources/schemes/B.xsd</xsd> <packagename>com.example.B</packagename> <!-- 绑定B的配置文件 --> <bindingFile>${basedir}/src/main/resources/bindings/B-binding.xjb</bindingFile> </xsdOption> </xsdOptions> </configuration> </plugin>
方案二:使用扩展参数(需额外依赖)
如果偏好通过插件参数配置,可借助JAXB2 Basics扩展来指定工厂类名称,但需要引入对应依赖。
1. 添加扩展依赖
在插件内添加JAXB2 Basics依赖:
<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-xjc-plugin</artifactId> <version>3.3.0</version> <!-- 执行配置不变 --> <executions>...</executions> <configuration>...</configuration> <dependencies> <dependency> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-basics</artifactId> <version>0.11.1</version> </dependency> </dependencies> </plugin>
2. 配置extensionArgs
在每个xsdOption中添加扩展参数,指定自定义工厂类名:
<xsdOption> <xsd>${basedir}/src/main/resources/schemes/A.xsd</xsd> <packagename>com.example.A</packagename> <extensionArgs> <extensionArg>-Xfactory-class</extensionArg> <extensionArg>com.example.A.AObjectFactory</extensionArg> </extensionArgs> </xsdOption> <xsdOption> <xsd>${basedir}/src/main/resources/schemes/B.xsd</xsd> <packagename>com.example.B</packagename> <extensionArgs> <extensionArg>-Xfactory-class</extensionArg> <extensionArg>com.example.B.BObjectFactory</extensionArg> </extensionArgs> </xsdOption>
注:方案一为JAXB标准方式,兼容性更好,无需额外引入依赖,优先推荐。
内容的提问来源于stack exchange,提问作者0xdeadbeef
相关产品推荐
相关产品推荐

