org.w3c.dom包可以从多个模块访问:<未命名>,java.xml。

52

我无法在Eclipse中导入org.w3c.dom.NodeList包,它显示:

包 org.w3c.dom 可从多个模块访问:<未命名>、java.xml"错误信息在Eclipse中显示。

请告诉我如何修复这个问题?

Eclipse版本:

Eclipse IDE for Enterprise Java Developers。

版本:2019-06(4.12.0)

构建ID:20190614-1200

Java版本:

java version "12.0.1" 2019-04-16

Java(TM) SE Runtime Environment (build 12.0.1+12)

Java HotSpot(TM) 64-Bit Server VM (build 12.0.1+12, mixed mode, sharing)


8
Java 9及以上版本存在一个限制:同一个包名不能在多个模块中使用。classpath中的所有内容都被视为包含在<unnamed>模块中。由于系统库已经使用了org.w3c.dom,因此即使没有使用JPMS(没有module-info.java文件),您的代码和所有依赖项/JAR文件也不能使用此包。所以,要么使用Java 8,要么摆脱包含org.w3c.dom包的代码/依赖项。 - howlger
1
您的代码和类路径上的所有内容都不得包含org.w3c.dom包(因为它已经在系统库中使用)。也许包含org.w3c.dom的JAR文件的新版本具有自己的名称空间,而不是org.w3c.dom,因此可以在Java 9及更高版本中使用。 - howlger
错误信息告诉了你包的名称,你可以使用Java搜索(Ctrl+H)来查找包在哪里被声明。顺便说一下,你的Eclipse版本已经落后三个发布版本了。你可能会浪费时间去解决已经修复的问题。 - howlger
@howlger 当我搜索声明时,它告诉我导入来自JDK11 -> java.xml。看不到任何其他声明。我的IDE中没有这个问题。我使用maven从命令行获取错误。也许我应该开一个单独的问题。 - ochs.tobi
显示剩余8条评论
18个回答

22

我曾经因为一个传递依赖的xml-apis出现了类似的问题。我通过Maven排除解决了这个问题:

<dependency>
    <groupId>org.apache.xmlgraphics</groupId>
    <artifactId>fop</artifactId>
    <version>0.95</version>
    
    <exclusions>
        <exclusion>
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis</artifactId>
        </exclusion>
    </exclusions>
</dependency>

另一个导致问题的依赖项,除了将其删除之外,我没有其他解决方案:

<dependency>
    <groupId>com.oracle.database.xml</groupId>
    <artifactId>xmlparserv2</artifactId>
    <version>${oracle.version}</version>
</dependency>

使用 mvn dependency:tree 命令查看哪个库引入了这个传递依赖,然后从那里排除掉它。

在我的情况下,我不得不在build.gradle中使用Java 17将xml-apis作为xercesImpl的依赖项排除,就像这样:implementation ('xerces:xercesImpl:2.12.2') { exclude group: 'xml-apis', module: 'xml-apis' } - undefined

17

令人失望的是,我没有看到任何编译器标志来显示问题所在的jar文件。

即使是-Xlint:module也似乎没有显示出任何有用的内容,而且eclipse也没有揭示这个问题的任何信息。

相反,为了找出org.w3c.dom来自哪里,我一直在使用这个脚本:

mvn dependency:copy-dependencies -DincludeScope=test -DoutputDirectory=deps
for i in deps/*.jar; do if unzip -l $i| grep -q org.w3c.dom; then echo $i; fi ; done

严格来说,您不必指定测试范围,因为这是默认值,但我已经包含了它,因为您可能希望使用compile代替。


9
在我的这边, 我花了几个小时来理解我的问题,真的接近这一个。
包 org.w3c.dom 可从多个模块访问: <unnamed>, java.xml

我想要将一个项目从Java 8迁移到Java 11。有一些库问题。很容易解决。但是在这件事上,

  • 我试图创建module-info.java → 最糟糕的情况。
  • 在我的操作系统(debian 10)找到了一个问题 → 即使Java 11是默认的JRE,$JAVA_HOME没有为 maven构建正确设置。当我认为这只是一个Eclipse问题时,最终我考虑到这是一个全局编译问题。为了解决这个问题,我必须添加以下行 ~/.mavenrc

    JAVA_HOME=/usr/lib/jvm/default-java

  • maven依赖项的深度分析向我展示了一个触发该问题的第三级依赖关系xom.jar。依赖关系与Saxon HE库相关联 →升级到版本9.9.X已解决了这个令人厌烦的问题。

希望这能帮助其他人。


我的配置:Debian 10,Java 11(OpenJDK),Maven 3.3.9,Eclipse 4.14。 - Damien C

7

在我的情况下,这是由于同时使用以下内容造成的:

  • JDK 11
  • dom4j 2.1.3

正如其他人所指出的那样,根本原因是 dom4j 及其依赖库 (例如 pull-parser) 使用了一些JDK已经使用过的包名 (javax.xml.parsers, org.w3c.dom)。

我不得不移除 dom4j 来解决问题。可以直接使用JDK自带的XML api。


2
同样的问题在这里,因为dom4j依赖于Jaxen并且捆绑了org.w3c.dom.UserContentHandler - Thorsten Schöning

4
在我的情况下,问题出在Apache POI库上。添加以下排除项。
<!-- Apache POI Library for Parsing Excel Sheets -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.0.0</version>
        <exclusions>
            <exclusion>
                <groupId>org.apache.xmlbeans</groupId>
                <artifactId>xmlbeans</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

3
对于 Java 9 及更高版本,只需从类路径中删除 org.w3c.dom jar 文件即可。顺便删除模块信息文件。您不需要添加外部jar文件,因为它已经包含在 Java 9 及更高版本的系统库中。

3
您可以使用以下代码(例如在单元测试中)来确定包含类的所有JAR文件:
getClass().getClassLoader().getResources("org/w3c/dom/NodeList.class");

这将给你一个Enumeration。最简单的打印方法是:
Collections.list(e).forEach(System.out::println);

代码都无法编译,你怎么能运行它呢? - Jonathan Benn

2

只需打开配置构建路径并验证模块,这些模块都是您作为项目的一部分添加的,其中包含类文件*

org.w3c.dom

通常由于在一个项目中添加了多个相同类型的API软件包而导致此错误。

因为我使用与您提到的版本相同的版本,所以没有遇到任何问题,因此请确保您没有重复的模块。


2

org.w3c.dom 用于以下方面:

<dependency>
    <groupId>org.apache.xmlbeans</groupId>
    <artifactId>xmlbeans</artifactId>
    <version>2.4.0</version>
</dependency>

检查是否通过其他依赖项传递导入此内容。 排除相同的内容

添加以下依赖关系:

<dependency>
    <groupId>org.apache.xmlbeans</groupId>
    <artifactId>xmlbeans</artifactId>
    <version>2.6.0</version>
</dependency>

1
在Gradle领域中,您可以通过运行以下命令来跟踪哪些依赖项正在为xml-api做出贡献:
gradlew -q dependencies

(或在多项目环境中的core项目中使用core:dependencies)。

在我的情况下,xml-apisnet.sourceforge.htmlunitxom同时请求,因此解决方案是在您的build.gradle中排除xml-apis

dependencies {
  implementation("net.sourceforge.htmlunit:neko-htmlunit:$nekoHtmlUnitVersion") {
    exclude group: "xml-apis"
  }
  testImplementation("xom:xom:$xomVersion") {
    exclude group: "xml-apis"
  }
  // ...other dependencies
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接