解决org.w3c.dom多模块冲突:需同时依赖jodreports与xom
解决“包org.w3c.dom可从多个模块访问”的冲突问题
问题根源
这个错误是Java 9+模块系统的拆分包(Split Package)问题:org.w3c.dom包同时存在于JDK自带的java.xml模块,以及第三方依赖xml-apis中。当xml-apis被引入到classpath时,它会被归到未命名模块(java.xml模块提供的同名包产生冲突,触发编译报错。
解决方案
方案1:全局排除xml-apis依赖
JDK自带的java.xml模块已经包含了xml-apis提供的所有核心类,因此可以直接全局排除该依赖,避免冲突:
// 全局排除所有依赖中的xml-apis configurations.all { exclude group: 'xml-apis', module: 'xml-apis' } // 正常引入xom和jodreports(排除jodreports自带的xom,避免重复) implementation('xom:xom:1.3.9') implementation('net.sf.jodreports:jodreports:2.4.0') { exclude group: 'xom' }
这种方式最简单,且不会影响xom和jodreports的正常运行——因为JDK已经提供了它们需要的org.w3c.dom相关类。
方案2:用--patch-module合并冲突包到系统模块
如果必须保留xml-apis(比如某些特殊场景下需要它的扩展类),可以通过编译器参数将xml-apis的内容补丁到JDK的java.xml模块中,消除拆分包冲突:
// 动态获取xml-apis的jar路径 def xmlApisJar = configurations.runtimeClasspath.files.find { it.name.startsWith('xml-apis-') } compileJava { options.compilerArgs += [ "--patch-module", "java.xml=${xmlApisJar.absolutePath}" ] } // 正常引入依赖(排除重复的xom) implementation('xom:xom:1.3.9') implementation('net.sf.jodreports:jodreports:2.4.0') { exclude group: 'xom' }
--patch-module参数会将xml-apis中的org.w3c.dom包合并到java.xml模块中,让整个模块系统中只有一个来源提供该包,解决冲突。
方案3:降级到Java 8(仅应急使用)
如果项目允许,降级到Java 8可以彻底规避模块系统的拆分包检查,但这只是临时方案,不推荐长期使用——因为Java 8已停止官方支持。
验证方法
配置完成后,执行./gradlew compileJava检查编译是否通过;同时运行项目核心功能,确认xom和jodreports的API能正常工作(比如生成报表、XML解析等)。
内容的提问来源于stack exchange,提问作者KurtJ
相关产品推荐
相关产品推荐

