JDK8升级JDK11 org.xml.sax多模块访问冲突及jtidy依赖问题求解
报错根因
你遇到的是Java 9+ JPMS模块系统的拆分包冲突问题:
- Java 11自带核心模块
java.xml,内置org.xml.sax、org.w3c.dom等XML相关公共包 - 你使用的
4aug2000r7-dev版本jtidy本身就内置了同包名的类文件,并非通过传递依赖引入,所以你之前配置的排除规则不生效 - 两个来源的同包名类同时存在,触发模块系统的访问限制,就出现了
The package org.xml.sax is accessible from more than one module: <unnamed>报错
解决方案
方案1:通过module-info.java配置解决(你询问的方案,完全可用)
如果你的项目已经启用模块系统(存在module-info.java文件),直接在文件中添加如下配置即可:
module 你的实际模块名 { // 优先声明使用JDK自带的java.xml模块,覆盖jtidy内置的重复包 requires java.xml; // 声明jtidy依赖,jtidy属于无模块信息的旧jar,归属未命名模块 requires jtidy; // 按需添加你项目需要的其他模块声明、导出配置 }
方案2:不启用模块系统的适配方案
如果你的项目不需要使用模块系统,不想加module-info.java,可以通过Maven编译配置规避冲突,同时解决Maven构建、命令行运行的报错:
- 保留pom.xml中的jtidy依赖,不需要排除传递依赖
- 调整maven-compiler-plugin配置,添加JVM参数禁用拆分包检查:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>11</source> <target>11</target> <compilerArgs> <arg>--add-exports</arg> <arg>java.xml/org.xml.sax=ALL-UNNAMED</arg> <arg>--add-exports</arg> <arg>java.xml/org.w3c.dom=ALL-UNNAMED</arg> </compilerArgs> </configuration> </plugin>
- 打可执行jar包时使用maven-assembly-plugin、maven-shade-plugin等插件打fat jar,将jtidy依赖打入最终jar包,运行时直接执行
java -jar 你的jar包名.jar即可,不需要额外指定类路径,不会出现NoClassDefFoundError报错。
方案3:替换jtidy版本(长期最优方案)
你使用的jtidy版本是2000年的非正式开发版,过于老旧,直接替换为官方维护的稳定版即可从根源解决冲突,不需要额外配置,且完全兼容旧版本API,无需修改业务代码:
<dependency> <groupId>net.sf.jtidy</groupId> <artifactId>jtidy</artifactId> <version>r938</version> </dependency>
内容的提问来源于stack exchange,提问作者badperson
相关产品推荐
相关产品推荐

