You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:53:18