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

JDK8升级JDK11 org.xml.sax多模块访问冲突及jtidy依赖问题求解

报错根因

你遇到的是Java 9+ JPMS模块系统的拆分包冲突问题:

  1. Java 11自带核心模块java.xml,内置org.xml.sax、org.w3c.dom等XML相关公共包
  2. 你使用的4aug2000r7-dev版本jtidy本身就内置了同包名的类文件,并非通过传递依赖引入,所以你之前配置的排除规则不生效
  3. 两个来源的同包名类同时存在,触发模块系统的访问限制,就出现了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构建、命令行运行的报错:

  1. 保留pom.xml中的jtidy依赖,不需要排除传递依赖
  2. 调整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>
  1. 打可执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:57:01