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

JAXB 2迁移至最新版本时,含annox的XSD无法生成文件报错

问题梳理

从JAXB 2迁移至最新版本(使用org.jvnet.jaxb:jaxb-maven-plugin:4.0.8)时,编译出现类缺失错误:

[ERROR] Failed to execute goal org.jvnet.jaxb:jaxb-maven-plugin:4.0.8:generate (schema-v2) on project org.myproject.exporter: Execution schema-v2 of goal org.jvnet.jaxb:jaxb-maven-plugin:4.0.8:generate failed: A required class was missing while executing org.jvnet.jaxb:jaxb-maven-plugin:4.0.8:generate: javax/xml/bind/JAXBException
[ERROR] -----------------------------------------------------
[ERROR] realm =    plugin>org.jvnet.jaxb:jaxb-maven-plugin:4.0.8
[ERROR] strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
[ERROR] urls[0] = file:/C:/Users/myuser/.m2/repository/org/jvnet/jaxb/jaxb-maven-plugin/4.0.8/jaxb-maven-plugin-4.0.8.jar
[ERROR] urls[1] = file:/C:/Users/myuser/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/4.0.2/jakarta.xml.bind-api-4.0.2.jar
...

同时存在两个附加问题:

  • 希望使用jakarta.xml而非javax.xmlAPI,但无法定位javax.xml依赖来源
  • 原fluent-api和annotate扩展不再被识别(此前使用org.jvnet.jaxb2.maven2:jaxb2-maven-plugin:0.14.0可正常生成代码)
排查与解决方向

1. 清理javax.xml.bind依赖冲突

  • 执行mvn dependency:tree命令,扫描项目依赖树,找出所有引入javax.xml.bind:jaxb-api的依赖,通过<exclusions>标签排除:
    <dependency>
        <groupId>xxx</groupId>
        <artifactId>xxx</artifactId>
        <version>xxx</version>
        <exclusions>
            <exclusion>
                <groupId>javax.xml.bind</groupId>
                <artifactId>jaxb-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
  • 确保jaxb-maven-plugin的依赖仅引入Jakarta版本的API与实现,避免插件加载到旧的javax类:
    <plugin>
        <groupId>org.jvnet.jaxb</groupId>
        <artifactId>jaxb-maven-plugin</artifactId>
        <version>4.0.8</version>
        <executions>
            <execution>
                <id>schema-v2</id>
                <goals>
                    <goal>generate</goal>
                </goals>
            </execution>
        </executions>
        <dependencies>
            <dependency>
                <groupId>jakarta.xml.bind</groupId>
                <artifactId>jakarta.xml.bind-api</artifactId>
                <version>4.0.2</version>
            </dependency>
            <dependency>
                <groupId>org.glassfish.jaxb</groupId>
                <artifactId>jaxb-runtime</artifactId>
                <version>4.0.4</version>
            </dependency>
        </dependencies>
    </plugin>
    

2. 适配fluent-api与annotate扩展的新版本

旧版本插件的扩展在新插件中已迁移至org.jvnet.jaxb:jaxb-plugins包,需做以下调整:

  • 在jaxb-maven-plugin的<dependencies>中引入扩展依赖:
    <dependency>
        <groupId>org.jvnet.jaxb</groupId>
        <artifactId>jaxb-plugins</artifactId>
        <version>4.0.1</version> <!-- 需与插件版本4.0.8兼容 -->
    </dependency>
    
  • 更新XJB文件的命名空间:将原javax相关命名空间替换为Jakarta版本,同时更新扩展命名空间:
    <jaxb:bindings xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb"
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                   xmlns:fluent="https://jaxb.java.net/fluent-api"
                   xmlns:annox="http://annox.dev.java.net"
                   jaxb:version="4.0">
        <!-- 原扩展配置可保留,仅更新命名空间前缀 -->
        <jaxb:globalBindings>
            <fluent:fluentApi/>
        </jaxb:globalBindings>
    </jaxb:bindings>
    

3. 确认JDK版本兼容性

JAXB 3.0+(Jakarta EE版本)要求JDK 11及以上版本,若仍使用JDK 8,会因JDK内置旧版javax.xml.bindAPI导致冲突,需升级JDK至11或更高版本。

4. 检查插件配置的参数

确保插件的generate目标未配置任何指向javaxAPI的参数,例如自定义的bindingDirectory下的配置文件未残留旧版javax命名空间的配置,保持默认适配Jakarta版本的设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:21:07