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

