IntelliJ JDK11下Java模块化项目报javax.xml.bind包读取冲突求解决
Java 模块化项目 JAXB 包重复读取报错解决方案
冲突根因
Java 模块系统强制遵循导出包唯一性规则:同一个被导出的包,只允许由一个模块提供访问入口,如果模块路径上存在多个模块同时导出同名包,就会触发Module X reads package Y from both A and B类报错。
结合你提供的依赖配置,冲突来自两个叠加的问题:
- 依赖层面引入了两套内容重叠的JAXB规范组件:Hibernate传递引入的
javax.xml.bind:jaxb-api、CXF 链路传递引入的jakarta.xml.bind:jakarta.xml.bind-api,两个jar包内部都包含完全一致的javax.xml.bind包下的类文件。 - 模块配置层面误用了JDK旧版本的内置模块声明:JDK 11已经将原内置的
java.xml.bind、java.activation等Java EE模块移出核心JDK,你本地引入的第三方JAXB jar被模块系统自动识别为同名模块java.xml.bind,两个不同jar被识别为同名同导出包的模块,直接触发规则冲突。
分步解决方法
- 清理Maven依赖中的重复组件
- 排除Hibernate传递引入的重复JAXB API依赖:在
hibernate-core的依赖配置中,排除javax.xml.bind:jaxb-api传递依赖,避免和CXF链路引入的Jakarta版本JAXB包内容重叠。 - 检查依赖树中的激活包组件,统一对齐到CXF要求的Jakarta版本,不要同时保留
javax.activation:javax.activation-api和com.sun.activation:jakarta.activation两个组件,二者同样存在包名重叠问题。 - 完成依赖调整后,刷新Maven依赖列表,确认树中不存在两个jar同时包含
javax.xml.bind、javax.activation包内容的情况。
- 排除Hibernate传递引入的重复JAXB API依赖:在
- 修正module-info.java的错误声明
- 移除已失效的JDK内置模块声明:删除
requires java.activation;、requires java.xml.bind;,这两个模块在JDK 11中已经不存在,声明无实际作用还会触发模块识别冲突。 - 替换为第三方依赖对应的正确模块名声明:
- 原
requires java.activation替换为requires jakarta.activation; - 原
requires java.xml.bind替换为requires jakarta.xml.bind; - 移除无实际使用场景的
requires java.xml;声明,避免和第三方XML组件的包产生隐式冲突。
- 原
- 修正后的参考module-info配置:
module com.test { requires jakarta.activation; requires slf4j.api; requires spring.context; requires java.persistence; requires spring.beans; requires org.apache.cxf.core; requires jakarta.xml.bind; } - 移除已失效的JDK内置模块声明:删除
- 清理IDE的模块缓存
- 在项目结构配置中,移除手动添加到模块路径的旧版JAXB jar,确保所有依赖全部由Maven统一解析注入。
- 执行IDE的项目缓存刷新操作,重新加载模块路径配置,避免残留旧的模块识别结果。
避坑提示
- 项目中不要混用javax和jakarta命名空间下的2.x版本同类API,这两个版本的API包名完全一致(如
javax.xml.bind),在模块系统下必然触发包冲突。 - 如果项目确实需要同时引入多个版本的同类API,建议移除module-info.java,切换为传统类路径运行模式,模块系统的强包唯一性规则不支持这种重复包的场景。
内容的提问来源于stack exchange,提问作者miroana
相关产品推荐
相关产品推荐

