Spring Boot应用从Java 8迁移至Java 11时遭遇org.w3c.dom包多模块冲突问题求助
解决Spring Boot从Java 8迁移到Java 11时的org.w3c.dom包冲突问题
这个错误是Java 9+引入的模块化系统(JPMS)导致的——org.w3c.dom是JDK自带模块java.xml的一部分,但你的项目依赖中还有其他JAR包也包含了这个包,导致模块路径上出现重复,JVM不知道该用哪一个。你注释了xerces依赖但没解决,说明还有其他依赖在偷偷引入重复的包,咱们一步步来处理:
第一步:找出隐藏的冲突依赖
首先用Maven命令排查整个依赖树,定位到底哪个依赖引入了包含org.w3c.dom的JAR(比如xml-apis、xercesImpl这类):
mvn dependency:tree -Dincludes=xml-apis,xercesImpl
执行后会输出所有包含这两个包的依赖路径,这样就能找到“元凶”。
第二步:排除冲突的依赖
找到对应的依赖后,在你的pom.xml里给它加上<exclusions>,把重复的包排除掉。比如如果是camel-cxf或者activemq-camel引入的,就这么改:
<!-- 以camel-cxf为例 --> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-cxf</artifactId> <exclusions> <exclusion> <groupId>xml-apis</groupId> <artifactId>xml-apis</artifactId> </exclusion> <exclusion> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId> </exclusion> </exclusions> </dependency>
同样检查activemq-camel依赖,做相同的排除操作。
第三步:修正pom里的拼写错误
注意到你pom里的groupId都写成了org.springframwork(少了一个e),正确的应该是org.springframework!另外spring-boot-starter-jersy的拼写也有误,应为spring-boot-starter-jersey。这些错误可能导致依赖拉取异常,甚至引入不必要的兼容包,先把这些拼写问题修正过来。
第四步:调整Eclipse的模块配置
Eclipse对JPMS的处理有时候会比较“敏感”,可以做以下检查:
- 右键项目 → Properties → Java Build Path → Modules
- 确保
java.xml模块是被正确引用的,没有把外部JAR中的org.w3c.dom标记为模块 - 如果有冲突的JAR,在Order and Export里调整优先级,让JDK自带的模块优先
附:你提供的原始pom配置(标注错误)
<properties> <java.version>11</java.version> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> </properties> <profiles> <profile> <id>dev</id> <dependencies> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-camel</artifactId> </dependency> </dependencies> </profile> </profiles> <dependencies> <dependency> <groupId>org.springframwork</groupId> <!-- 错误:应为org.springframework --> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframwork</groupId> <!-- 错误:应为org.springframework --> <artifactId>spring-jms</artifactId> <version>5.1.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframwork</groupId> <!-- 错误:应为org.springframework --> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframwork</groupId> <!-- 错误:应为org.springframework --> <artifactId>spring-boot-starter-jersy</artifactId> <!-- 错误:应为spring-boot-starter-jersey --> </dependency> <dependency> <groupId>org.springframwork</groupId> <!-- 错误:应为org.springframework --> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-cxf</artifactId> </dependency> </dependencies>
按照上面的步骤操作后,应该就能解决这个包冲突问题了。
内容的提问来源于stack exchange,提问作者subba rao ikkurthi
相关产品推荐
相关产品推荐

