我正在 Eclipse 中开发 Maven 项目(分支平台-bom_brussels-sr7)。当我最近尝试将项目的 Java 构建路径切换到 JDK 10 时,Eclipse 构建无法再找到诸如 javax.xml.xpath.XPath
、 org.w3c.dom.Document
或 org.xml.sax.SAXException
-ce-d16 之类的类似乎只有 XML 相关类受到影响,主要来自 Maven 依赖 xml-apis-1.4.01
。
尝试从 Eclipse 构建 Maven 没有错误。按住 Ctrl-左键单击其中一个假定缺失的类可找到该类并在 Eclipse 编辑器中将其打开。似乎只有 Eclipse 构建受到影响。
我尝试了几件事,但没有帮助。我试过了:
- 项目清洁
- 不同的 Eclipse 版本:氧气和光子。
- 使用 JDK 8 和 JDK 10 运行 Eclipse 本身。
- 更改项目的编译器合规性级别。它在 JDK 8 构建路径下以合规性级别 8 和 10 构建,并且在构建路径中使用 JDK 10 时均失败。
原文由 Carsten 发布,翻译遵循 CC BY-SA 4.0 许可协议
我假设从 Java 1.8 迁移的项目仍然没有
module-info.java
。这意味着您正在“未命名模块”中编译代码。未命名模块中的代码“读取”所有可观察的命名和未命名模块,特别是它从 JRE 系统库中读取模块“java.xml”。该模块导出类似
java.xml.xpath
的包。此外,您在类路径上有
xml-apis.java
,它提供了另一组同名的包(java.xml.xpath
和朋友)。据说这些与未命名模块相关联,就像您自己的代码一样。这种情况违反了 JLS §7.4.3 (最后一段)中定义 的“唯一可见性”的要求。特别是每个限定类型名称 Q.Id ( JSL §6.5.5.2 ) 都要求其前缀 Q 是唯一可见的包(为简单起见,我忽略了嵌套类型的情况)。因此:该程序是非法的,必须被编译器拒绝。
这给我们留下了一个问题和两个解决方案:
(1) 问题:为什么javac接受程序?
(2) 解决方案:如果将
module-info.java
添加到项目中,则可以通过 要求 项目读取哪个模块来控制requires java.xml;
或requires xml.apis;
.apis”是“xml-apis-1.4.01.jar”的自动模块名称。(3) 解决方案:除了将您的项目转换为模块之外,您仍然可以通过从可观察模块集中排除
java.xml
来避免冲突。在命令行上,这将使用--limit-modules
完成。 Eclipse 中的等效项是 “Modularity Details”对话框,另请参阅 JDT 4.8 New&Noteworthy (查找 Contents 选项卡)。由于java.xml
是通过许多其他默认可观察模块隐式需要的,因此将除了java.base
之外的所有内容从右(“显式包含的模块”)推到左可能是个好主意(“可用模块”)(并有选择地重新添加项目需要的那些模块)。PS:Eclipse 仍然没有提供理想的错误消息,而不是“无法解决”,它实际上应该说:“包 javax.xml.xpath 可以从多个模块访问:javax.xml,<未命名>。
PPS:也很奇怪:为什么改变 JRE 和类路径上的 jar 之间的顺序(这种顺序不是 javac 或 JEP 261 支持的概念)会改变编译器的行为。
编辑: