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

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 02:22:09