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

JDK20迁移JAXB编译工具遇Java模块化问题求助

问题根源与解决办法

问题1:requires java.xml.bind提示模块未找到

JDK 9及以后版本已经移除了所有Java EE相关的内置模块(包括JAXB的java.xml.bind),这些功能全部迁移到了外部依赖中,所以你在module-info.java里引用的这个模块名在JDK 20中根本不存在。

问题2:javax.xml.bind包不可见

你使用的jaxb-api 2.3.1属于自动模块(没有内置module-info.java的JAR包),默认情况下你的模块化项目不会自动读取未命名模块中的包,必须显式在module-info.java中声明对该自动模块的依赖。


解决步骤(两种可选方案)

方案一:继续使用javax.xml.bind包(兼容旧代码)

1. 修正Maven依赖

使用兼容JDK 9+的JAXB 2.x版本,替换你现有的依赖:

<dependencies>
    <!-- JAXB API -->
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.3</version>
    </dependency>
    <!-- JAXB 运行时实现 -->
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.3</version>
        <scope>runtime</scope>
    </dependency>
    <!-- JAXB 核心工具类 -->
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.3.3</version>
        <scope>runtime</scope>
    </dependency>
    <!-- 若用xjc生成KML类,需添加此依赖 -->
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-xjc</artifactId>
        <version>2.3.3</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

2. 修改module-info.java

jaxb-api 2.3.3的自动模块名为javax.xml.bind.api,在你的模块声明中添加依赖:

module your.module.name {
    // 声明依赖JAXB自动模块
    requires javax.xml.bind.api;
    // 如果生成的KML类需要被其他模块访问,添加exports声明
    // exports com.your.package.kml;
}

方案二:迁移到Jakarta EE标准(推荐,长期维护)

JAXB已正式迁移到Jakarta EE,包名从javax.xml.bind改为jakarta.xml.bind,后续版本只会维护Jakarta分支。

1. 修正Maven依赖

使用Jakarta JAXB 4.x版本(适配JDK 11+):

<dependencies>
    <!-- Jakarta JAXB API -->
    <dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
        <version>4.0.1</version>
    </dependency>
    <!-- Jakarta JAXB 运行时实现 -->
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>4.0.4</version>
        <scope>runtime</scope>
    </dependency>
    <!-- 若用xjc生成KML类,需添加此依赖 -->
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-xjc</artifactId>
        <version>4.0.4</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

2. 调整代码导入

将所有生成类中的import javax.xml.bind.*替换为import jakarta.xml.bind.*。

3. 修改module-info.java

Jakarta JAXB是标准命名模块,直接声明依赖:

module your.module.name {
    requires jakarta.xml.bind;
    // 若需暴露KML类给其他模块,添加exports声明
    // exports com.your.package.kml;
}

额外注意事项

如果使用maven-jaxb2-plugin生成KML类,需升级插件版本到0.15.3及以上,确保兼容JDK 9+和模块化项目。插件配置示例:

<build>
    <plugins>
        <plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <version>0.15.3</version>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <schemaDirectory>${project.basedir}/src/main/resources</schemaDirectory>
                <!-- 若用Jakarta,可添加绑定文件指定命名空间 -->
                <!-- <bindingDirectory>${project.basedir}/src/main/resources</bindingDirectory> -->
            </configuration>
        </plugin>
    </plugins>
</build>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 10:14:54