【问题标题】:The package org.w3c.dom is accessible from more than one module: <unnamed>, java.xmlorg.w3c.dom 包可以从多个模块访问:<unnamed>、java.xml
【发布时间】:2019-12-08 17:46:55
【问题描述】:

我无法将 org.w3c.dom.NodeList 包导入 Eclipse。它正在显示

可以从多个模块访问包 org.w3c.dom:&lt;unnamed&gt;, java.xml" eclipse 中的错误消息。

请告诉我如何解决这个问题?

Eclipse 版本:

面向企业 Java 开发人员的 Eclipse IDE。

版本:2019-06 (4.12.0)

版本号:20190614-1200

Java 版本:

java版本“12.0.1”2019-04-16

Java(TM) SE 运行时环境(内部版本 12.0.1+12)

Java HotSpot(TM) 64 位服务器 VM(内部版本 12.0.1+12,混合模式,共享)

【问题讨论】:

  • 这是 Java 9 及更高版本的限制:不能在多个模块中使用相同的包名。类路径上的所有内容都被视为包含在 &lt;unnamed&gt; 模块中。由于系统库中已经使用了org.w3c.dom,因此即使不使用 JPMS(没有module-info.java 文件),您的代码和所有依赖项/JAR 也不得使用此包。因此,要么使用 Java 8,要么摆脱包含 org.w3c.dom 包的代码/依赖项。
  • 感谢您的更新。我使用的是 java 12 版本,所以我不能降级版本。请让我知道如何创建包含 org.w3c.dom 包的代码/依赖项?
  • 您的代码和类路径中的所有内容不得包含org.w3c.dom 包(因为它已在系统库中使用)。也许包含 org.w3c.dom 的 JAR 的较新版本在较新版本中具有自己的包名称空间而不是 org.w3c.dom,因此它可以在 Java 9 及更高版本中使用。

标签: java eclipse dom w3c java-12


【解决方案1】:

就我而言,罪魁祸首是 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>

【讨论】:

    【解决方案2】:

    您需要手动检查并删除所有可能与java.xml包冲突的jar(库)。

    就我而言,我编辑了我的 .classpath 文件并删除了以下 jar,它解决了问题:

    jtidy.jar, castor-0.9.5.4-xml.jar, xercesImpl.jar, xml-apis.jar
    

    【讨论】:

      【解决方案3】:

      如果您在一个简单的 Java 项目 中,而不是 Maven。 然后只需从库中删除 dom-jaxb jar

      步骤: 右键单击项目 -> 属性 -> Java BuildPath -> 库选项卡 -> 选择 jars,例如 dom-2.3.0-jaxb-1.0.6(版本可能不同) -> 删除。

      现在它将无错误地构建。

      发生错误是因为“org.w3c.dom.Document”来自已删除的“dom-2.3.0-jaxb-1.0.6”jar 和 Java 的内置库。删除额外的 jar 将使其仅来自 Java 的内置库。

      【讨论】:

        【解决方案4】:

        由于传递 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 查看是谁引入了传递依赖,然后从那里排除。

        【讨论】:

          【解决方案5】:

          就我而言,我使用的是:
          JDK 14xmlbeans.jar 库。
          我只需要删除 xmlbeans.jar 库,它肯定解决了这个问题。

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

              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>
              

              【讨论】:

                【解决方案8】:

                令人失望的是,我没有看到任何编译器标志来显示问题所在的 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】:

                  在我的情况下,它是由结合使用引起的:

                  • JDK 11
                  • dom4j 2.1.3图书馆

                  正如其他人所指出的,根本原因是dom4j 及其依赖项(例如,pull-parser)使用了一些已被 JDK 使用的包名称(javax.xml.parsersorg.w3c.dom)。

                  我必须删除 dom4j 才能解决问题。只需使用 JDK 自己的 XML api。

                  【讨论】:

                    【解决方案10】:

                    就我而言,我花了几个小时来了解我的问题,真的很接近这个问题。
                    The package org.w3c.dom is accessible from more than one module: &lt;unnamed&gt;, java.xml

                    我想将一个项目从 Java 8 迁移到 Java 11。一些库问题。易于修复。但在这一点上,

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

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

                    • 对 maven 依赖项的深入分析向我展示了对触发问题的 xom.jar 的第三级依赖项。依赖关系链接到 Saxon HE 库 → 升级到 VERSION 9.9.X 解决了这个无聊的问题。

                    希望这对其他人有所帮助。

                    【讨论】:

                    • 我的配置:debian 10、java 11 (openjdk)、maven 3.3.9、eclipse 4.14
                    【解决方案11】:

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

                    org.w3c.dom

                    这个错误,我们在Java中通常是由于在一个项目中添加了同一种类型的多个API包。

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

                    【讨论】:

                      猜你喜欢
                      • 2021-02-28
                      • 1970-01-01
                      • 2021-05-24
                      • 2020-08-16
                      • 1970-01-01
                      • 2022-09-27
                      • 2019-07-18
                      • 1970-01-01
                      • 2021-06-12
                      相关资源
                      最近更新 更多