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
相关产品推荐
相关产品推荐

