Java 9模块化JUnit 5测试报错:无法派生模块描述符
FindException问题 你遇到的这个错误根源很明确:org.junit.jupiter.migrationsupport_5.0.0.v20170910-2246.jar这个迁移支持模块的描述符有问题——它声明了服务提供者org.junit.jupiter.engine.JupiterTestEngine,但这个类根本不在这个jar包里,而是属于junit-jupiter-engine模块。下面是几个针对性的解决方法:
1. 移除不必要的迁移支持模块(最快解决)
如果你的项目没有用到JUnit 4到JUnit 5的迁移特性(比如@RunWith(JUnitPlatform.class)这类兼容注解),完全可以直接把org.junit.jupiter.migrationsupport模块从依赖中移除,立刻避开这个模块描述符的bug。
修改你的module-info.java,删除相关依赖声明:
module your.project.module { requires org.junit.jupiter.api; requires org.junit.jupiter.engine; // 删掉这行:requires org.junit.jupiter.migrationsupport; }
2. 升级JUnit 5到稳定新版本
你当前用的JUnit 5.0.0是非常早期的版本,模块系统相关的bug还比较多。建议升级到5.9.x或更高的稳定版本,这些版本已经修复了大量模块描述符的问题。
在Eclipse中重新添加JUnit 5库时,选择最新的稳定版本,务必保证所有JUnit 5模块(api、engine、migrationsupport等)的版本完全一致。
3. 清理Eclipse的p2缓存并重新导入模块
报错里提到的jar存在于Eclipse的p2缓存池中,可能出现了缓存损坏或版本不匹配的情况:
- 先关闭Eclipse
- 找到路径
C:\Users\Tim HP.p2\pool\plugins,删除所有以org.junit.jupiter开头的jar文件 - 重启Eclipse,重新给项目添加JUnit 5模块,确保下载的是完整且版本统一的模块包
4. 确认模块路径配置正确
在Eclipse的项目构建路径中,一定要把JUnit 5的所有模块添加到模块路径(Modulepath),而不是类路径(Classpath)。如果放在类路径下,Java模块系统会自动推导模块描述符,很容易出现这类找不到提供者的错误。
内容的提问来源于stack exchange,提问作者Linsane




