当前位置: 代码迷 >> java >> 无法派生模块描述符:提供程序 {class X} 不在模块中
  详细解决方案

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

热度:55   发布时间:2023-08-02 10:33:21.0

当我尝试编译新的模块化 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\2.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

有什么建议可以解决或解决这个问题吗? 我发现关于这个问题的文档很少。

夏兰

我在他们之后查看了他们的错误跟踪器,但无法找到此报告,也不确定该库的维护程度如何。


一般说明

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

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

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

短期黑客

解决这个问题的调整之一是更新库 jar(修补它)并在您不使用服务文件时删除它。 或者添加从相应工件复制的提供者。

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

长期解决

一个理想的方法是向维护者报告并解决它。 这取决于他们维护它的积极程度,例如xalan的最后一个版本是将近 5 年前,在我看来,可能只是想寻找一个积极参与的替代方案。

我尝试在 Eclipse 中为 TestNG 安装更新:“帮助 -> 检查更新 -> 取消全选并选择 TestNG 复选框。然后
安装最新版本我安装了以 7.2.0 开头的版本。

它为我解决了这个问题。

  相关解决方案