排除依赖无助于解决“包 org.w3c.dom 可从多个模块访问:<unnamed>, java.xml”

问题描述

尝试设置 Java 版本 > 9 的项目时,我遇到了依赖项和 Java 模块系统的问题。我知道有一些关于此主题的帖子(例如 this onethis one),但解决方案(从依赖项中排除包)似乎对我没有帮助。
在一些与 XML 解析相关的导入中,我收到以下错误 The package org.w3c.dom is accessible from more than one module: <unnamed>,java.xml

我使用了“打开类型”对话框,发现实际上有两个提供程序,例如org.w3c.dom.Document。

Two providers of org.w3c.dom.Document

这个 rmlmapper-4.9.1.jar 目前是我项目中唯一的 maven 依赖项,我尝试按照建议的 here 排除 xml-apis。如您所见,我还添加了 org.w3c.dom。

<dependencies>
    <dependency>
        <groupId>be.ugent.rml</groupId>
        <artifactId>rmlmapper</artifactId>
        <version>4.9.1</version>
        <exclusions>
            <exclusion>
                <groupId>xml-apis</groupId>
                <artifactId>xml-apis</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.w3c</groupId>
                <artifactId>dom</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

不幸的是,这无济于事,错误仍然存​​在。请注意,我可以构建项目,但在运行时会出错。我是否排除了错误的包裹?我找不到使用 org.w3c.dom 提供 mvn dependency:tree 的包,那么如何找到需要排除的包?

解决方法

从您提供的 Eclipse 快照来看,包 org.w3c.dom 似乎嵌入在 rmlmapper 依赖项 Jar 本身中(Jar 可能将其自己的依赖项捆绑在其中)。因此 exclusion 将不起作用,因为它只排除传递依赖项(不是捆绑包)。即使 it's possible to exclude the package,另一种方法是排除 java.xml 模块,并使用 --limit-modules 选项作为回答 here。请注意,如果 rmlmapper 还捆绑了其他 JDK 类,您可能必须对其他模块执行此操作。

无论哪种方式,最好的解决方案是联系 rmlmapper 库的所有者,让他们知道 Java 9+ 上的问题,因为他们可能没有升级项目以支持该版本。