我正在将Java 8项目迁移到Java 11。使用的IDE是Eclipse 2020-09。我没有模块化这个项目。
对于以下导入:
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
我得到编译时错误信息:
The package org.w3c.dom is accessible from more than one module: <unnamed>, java.xml
我已经检查了我的项目和org.w3c.dom包没有出现在第三方库中,也没有由项目jar中的任何可传递依赖项添加。
但是请注意org.w3c.dom。文档是一个接口,我发现很少有库实现这个接口。这是
的根本原因吗?包可以从多个模块访问
口信吗?
下面是org.w3c.dom的实现。Eclipse项目中的文档
在上面的屏幕截图中可以看到,JBoss EAP 7.3运行时库包含org.w3c.dom.Document
的实现。是否可以说JBoss运行库导致了我所遇到的Java 11迁移问题?
Java 9引入了一个在JLS§7.4.3中定义的新需求。每个限定类型名都要求其前缀是唯一可见的包。不兼容性是由于以前的Java版本中允许的传递依赖关系。
当项目属性,Java编译器,"编译器遵从级别";设置为高于"1.8",Eclipse将报告违反此需求的情况。由于使用Streaming 10.6或更高版本时的自定义Java实现将在Java 11 JVM中运行,因此必须解决这些问题。
分辨率选择是:
- 将库升级到Java 11兼容的版本传递依赖,
- 在POM中显式排除冲突dependencyManagement或
- 通过只导入来避免冲突需要的类,在import中不使用通配符(*)语句。
在所有情况下,都需要进行一些调查,通过了解每个库将哪些包带入项目以及这些库中类的具体用途来找到冲突的根源。要查看每个库暴露给项目的依赖项,使用:
mvn dependency:tree
这将提供信息来查找需要显式导入或排除的内容。
引用自:https://support.tibco.com/s/article/Upgrading-Streaming-projects-to-use-Java-11-package-is-accessible-from-more-than-one-module