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