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

如何在Gradle中从XSD生成无命名空间的JAXB类

问题:Gradle JAXB生成带命名空间的类,如何改为无命名空间?

我正在将大型项目构建从Maven迁移至Gradle,其中包含使用JAXB从XSD生成类的步骤。Maven构建生成的类无命名空间(符合需求,因需用于两个不同命名空间),但Gradle构建生成的类的@XMLRootElement注解带有命名空间,导致无法正常工作。我使用com.intershop.gradle.jaxb插件,配置看似与Maven的maven-jaxb2-plugin一致,请问如何修改Gradle构建步骤以生成无命名空间的类?

Maven原配置

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.14.0</version>
    <configuration>
        <schemaDirectory>${project.build.directory}/classes/xmlbuild</schemaDirectory>
        <bindingDirectory>${project.build.directory}/classes/xmlbuild</bindingDirectory>
        <strict>false</strict>
        <schemaIncludes>
            <include>**/*.xsd</include>
        </schemaIncludes>
        <bindingIncludes>
            <include>**/*.xjb</include>
        </bindingIncludes>
        <args>
            <arg>-Xannotate</arg>
            <arg>-Xvalue-constructor</arg>
            <arg>-XtoString</arg>
            <arg>-Xequals</arg>
            <arg>-XhashCode</arg>
            <arg>-Xcopyable</arg>
            <arg>-Xmergeable</arg>
            <arg>-Xdefault-value</arg>
            <arg>-Xfluent-api</arg>
        </args>
        <extension>true</extension>
    </configuration>
</plugin>

Gradle原配置

jaxb {
  javaGen {
    apiModelClasses {
        schemas = fileTree("$buildDir/path/to/xsds") {
            include '*.xsd'
        }
        bindings = fileTree("$buildDir/path/to/xsds") {
            include '*.xjb'
        }
        extension = true
        antTaskClassName = 'org.jvnet.jaxb2_commons.xjc.XJC2Task'
        args = [
                '-npa',                     
                '-Xannotate',
                '-Xvalue-constructor',
                '-XtoString',
                '-Xequals',
                '-XhashCode',
                '-Xcopyable',
                '-Xmergeable',
                '-Xdefault-value',
                '-Xfluent-api',
                '-verbose'
        ]
    }
  }
}

解决步骤

  • 移除-npa参数:该参数会禁止生成package-info.java,导致XJC将命名空间直接写入@XMLRootElement注解中。Maven配置中无此参数,因此生成的类注解不带命名空间。
  • 添加strict = false配置:对应Maven中的<strict>false</strict>,开启宽松模式处理XSD,避免命名空间相关的严格校验问题。

修改后的Gradle配置

jaxb {
  javaGen {
    apiModelClasses {
        schemas = fileTree("$buildDir/path/to/xsds") {
            include '*.xsd'
        }
        bindings = fileTree("$buildDir/path/to/xsds") {
            include '*.xjb'
        }
        extension = true
        strict = false // 新增:对应Maven的strict配置
        antTaskClassName = 'org.jvnet.jaxb2_commons.xjc.XJC2Task'
        args = [
                // 移除了-npa参数
                '-Xannotate',
                '-Xvalue-constructor',
                '-XtoString',
                '-Xequals',
                '-XhashCode',
                '-Xcopyable',
                '-Xmergeable',
                '-Xdefault-value',
                '-Xfluent-api',
                '-verbose'
        ]
    }
  }
}

内容的提问来源于stack exchange,提问作者Hedley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:43:10