无法派生模块描述符:提供程序 {class X} 不在模块中

Unable to derive module descriptor: Provider {class X} not in module

我在尝试编译新的模块化 Java 11 应用程序时收到此错误消息:

Error occurred during initialization of boot layer
java.lang.module.FindException: Unable to derive module descriptor for C:\Users\inter\.m2\repository\xalan\xalan.7.2\xalan-2.7.2.jar
Caused by: java.lang.module.InvalidModuleDescriptorException: Provider class org.apache.bsf.BSFManager not in module

这似乎是一个依赖项的依赖项的问题。我什至找不到哪个模块在拉它,所以我可以更新它。

我正在使用 openjdk 11.0.2、IntelliJ 2018.3.4、Maven

关于如何解决或修复此问题的任何建议?我发现关于这个问题的文档很少。

夏兰

我在 their index page 之后查看了他们的错误跟踪器,但未能找到此报告,也不确定该库的维护有多积极。


一般说明

只是为了解释是什么导致了您的代码中的问题,我会分享一个屏幕截图,然后尝试在其周围添加详细信息。

因此在版本 2.7.2 的 JAR 中,有服务声明 (META-INF/services),其中包括 org.apache.xalan.extensions.bsf.BSFManager。此处的服务文件必须为其自身指示提供者,并且 class 应该存在于要解析的模块路径上,以便可靠地配置模块。

在这种情况下,对于模块 xalan(自动模块),列出的服务没有将提供程序 class 打包在依赖项本身中。 (请参阅包 org.apache,它没有进一步包含包 bsf 和 class BSFManager。因此,您得到的例外情况。

短期黑客

解决该问题的调整之一是更新库 jar(对其进行修补)并删除服务文件(如果您不使用它)。或者添加从相应工件复制的提供程序。

如果您不直接依赖此工件或其父依赖项,您可以让它们保留在 --classpath 上并作为应用程序的 unnamed module 解析。

长期解决

理想的方法是将此问题报告给维护人员并解决。这取决于他们维护它的积极程度,例如xalan 的最后一个版本是将近 5 年前的事了,我认为可能只是想寻找一个积极参与的替代方案。

我尝试在 eclipse 中安装 TestNG 的更新: "Help -> Check for updates -> deselect all and select TestNG 复选框。然后
安装最新版本 我安装了以 7.2.0 开头的版本。

它为我解决了这个问题。