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

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

任何建议,我可以如何排除故障或解决此问题?我发现关于这个问题的文档很少。


答案 1

沙兰

我在他们的索引页面之后看了一下他们的错误跟踪器,但无法找到这个报告,也不确定库的维护有多活跃。


一般说明

为了解释导致代码中出现问题的原因,我会分享一个屏幕截图,然后尝试添加有关它的详细信息。

Screenshot

因此,在 JAR 中,对于版本 2.7.2,有服务声明 () 包含其中之一。这里的服务文件必须为自身指示提供程序,并且该类应该存在于要解析的模块路径上,以便可靠地配置模块。META-INF/servicesorg.apache.xalan.extensions.bsf.BSFManager

在本例中,对于模块(自动模块),列出的服务没有在依赖项本身中打包提供程序类。(请参阅包 ,它没有进一步的包和类。因此,你得到的例外。xalanorg.apachebsfBSFManager

短期黑客

解决此问题的调整之一是更新库jar(修补它)并摆脱服务文件(如果您不使用它)。或者添加从相应项目复制的提供程序。

如果不直接依赖于此项目或其父依赖项,则可以让这些项目保留在 上,并作为应用程序的未命名模块进行解析。--classpath

长期解决方案

一个理想的方法是向维护人员报告这个问题并解决它。这取决于他们如何积极地维护它,例如,上一个版本是近5年前的,在我看来,可能只是想寻找一个积极参与的替代方案。xalan


答案 2

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

它为我解决了这个问题。


推荐