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

Java 11用JAXB 3构建报错:前缀''已绑定至''求助

关于Java 11下JAXB构建错误“Prefix '' is already bound to ''”的排查与解决

错误信息

[INFO] Created EpisodePath [XXXX/src/main/java/META-INF/JAXB]: true
[INFO] Ignored given or default xjbSources [XXXX/src/main/xjb], since it is not an existent file or directory.
[ERROR] Failed to execute goal org.codehaus.mojo:jaxb2-maven-plugin:2.5.0:xjc (xjc) on project XXXX: Prefix '' is already bound to ''

环境与已尝试操作

  • 项目需兼容Java 8和Java 11,基于Java 8构建可在两个版本运行
  • 当前使用JAXB 3.0.0
  • 可用jaxb2-maven-plugin版本:1.5.0、2.3.0、2.3.1、2.5.0(因Maven版本老旧无法使用3.2.0)
  • 已尝试替换jaxb-xjc版本为3.1.0-M1、4.0.0,错误依然存在

项目POM配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>XXXXXXXXXX</artifactId>
    <packaging>jar</packaging>
    <name>XXXXXXXXX</name>

    <parent>
        <groupId>XXXXXXXX</groupId>
        <artifactId>XXXXXXXX</artifactId>
        <version>XXXXXXXX</version>
    </parent>
    
    <properties>
        <jakarta.activation.version>2.0.0</jakarta.activation.version>
        <jakarta.xml.bind-api.version>3.0.0</jakarta.xml.bind-api.version>
        <jaxb-impl.version>3.0.0</jaxb-impl.version>
        <jaxb-runtime.version>3.0.0</jaxb-runtime.version>
        <jaxb-xjc.version>3.0.0</jaxb-xjc.version>
        <validation-api.version>2.0.1.Final</validation-api.version>
        <hibernate-validator.version>6.2.5.Final</hibernate-validator.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>jakarta.xml.bind</groupId>
            <artifactId>jakarta.xml.bind-api</artifactId>
            <version>${jakarta.xml.bind-api.version}</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <scope>runtime</scope>
            <version>${jaxb-impl.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>${jaxb-runtime.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>${validation-api.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>${hibernate-validator.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>

            <!-- exclude xsd/xml from jar -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>*.xml</exclude>
                        <exclude>*.xsd</exclude>
                    </excludes>
                </configuration>
            </plugin>
            
            <plugin>
                <artifactId>maven-remote-resources-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>bundle</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <includes>
                        <include>**/*.xsd</include>
                    </includes>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>jaxb2-maven-plugin</artifactId>
                <version>2.5.0</version>
                <executions>
                    <execution>
                        <id>xjc</id>
                        <goals>
                            <goal>xjc</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <outputDirectory>${project.basedir}/src/main/java</outputDirectory>
                        <packageName>XXXXXXXXX</packageName>
                        <sources>
                            <source>${project.basedir}/src/main/resources/TD.xsd</source>
                        </sources>
                        <!-- so we keep the src/main/java/.gitignore file which otherwise will 
                            be deleted -->
                        <clearOutputDir>false</clearOutputDir>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>com.sun.activation</groupId>
                        <artifactId>jakarta.activation</artifactId>
                        <version>${jakarta.activation.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>jakarta.xml.bind</groupId>
                        <artifactId>jakarta.xml.bind-api</artifactId>
                        <version>${jakarta.xml.bind-api.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>com.sun.xml.bind</groupId>
                        <artifactId>jaxb-impl</artifactId>
                        <version>${jaxb-impl.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.glassfish.jaxb</groupId>
                        <artifactId>jaxb-xjc</artifactId>
                        <version>${jaxb-xjc.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>

可能的解决方案

1. 检查XSD文件中的命名空间定义

该错误大概率是XSD中存在重复的空前缀绑定导致的,检查TD.xsd:

  • 是否多处声明了空命名空间(xmlns="")
  • 导入/包含的其他XSD中是否也定义了空命名空间
  • 确保默认命名空间只定义一次,无重复绑定

2. 调整jaxb2-maven-plugin配置

在插件配置中添加参数,调整命名空间处理策略:

<configuration>
    <!-- 保留原有配置 -->
    <arguments>
        <argument>-nv</argument> <!-- 关闭严格命名空间验证 -->
        <argument>-extension</argument> <!-- 启用扩展支持 -->
    </arguments>
</configuration>

3. 降级JAXB版本并对齐插件兼容性

JAXB 3.0.0基于Jakarta EE规范,而jaxb2-maven-plugin 2.x版本对Jakarta API的兼容存在问题。可切换到兼容Java 8/11的JAXB 2.3.x版本:

  • 修改properties中的版本:
<jaxb-api.version>2.3.3</jaxb-api.version>
<jaxb-impl.version>2.3.3</jaxb-impl.version>
<jaxb-runtime.version>2.3.3</jaxb-runtime.version>
<jaxb-xjc.version>2.3.3</jaxb-xjc.version>
  • 调整依赖groupId适配老版本插件:
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>${jaxb-api.version}</version>
</dependency>

4. 清理残留文件后重新构建

执行mvn clean install,彻底清理之前生成的JAXB类文件,避免残留文件引发冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:08:14