执行Maven测试时编译失败:module-info.java提示找不到org.junit.jupiter.api模块
嘿,我来帮你排查下这个困扰你的编译问题!从你贴出来的配置来看,有几个关键细节没处理好,咱们一步步来修正:
测试模块的依赖配置位置错了
你现在把requires org.junit.jupiter.api写在了主模块的module-info.java里,但这个依赖是testscope的,主模块根本不应该依赖测试库。正确的做法是在test目录下单独创建一个module-info.test.java(注意后缀是.test.java),专门用来配置测试模块的依赖:module 你的模块名.test { requires 你的模块名; // 依赖主模块 requires org.junit.jupiter.api; opens com.yourpackage.tests to org.junit.jupiter.api; // 让JUnit能反射访问测试类 }主模块的
module-info.java只保留业务相关的依赖就行,别碰测试库。Maven编译器插件没开启模块化支持
你的maven-compiler-plugin版本是3.8.1,虽然指定了Java版本9,但没明确开启模块化处理。建议升级到更适配Java 9+的版本(比如3.11.0),同时加上<modulepath>true</modulepath>配置:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>9</source> <target>9</target> <modulepath>true</modulepath> <!-- 关键:启用模块化编译 --> </configuration> </plugin>测试依赖的
<type>module</type>是多余的
JUnit 5从5.6.0开始已经是模块化JAR了,Maven会自动识别,手动加<type>module</type>反而可能引发冲突,直接删掉这一行就行。检查项目目录结构是否匹配配置
你指定了<sourceDirectory>src</sourceDirectory>和<testSourceDirectory>test</testSourceDirectory>,得确保目录结构是模块化的:- 主代码要放在
src/你的模块名/下面,比如src/com.yourmodule/YourClass.java - 测试代码放在
test/你的模块名.test/下面,比如test/com.yourmodule.test/YourTest.java
如果还是用传统的src/main/java、src/test/java结构,那最好删掉手动指定的sourceDirectory和testSourceDirectory,让Maven用默认结构,这样模块化处理会更顺畅。
- 主代码要放在
按照上面的步骤调整后,再重新运行mvn test试试,应该能解决编译错误了!
内容的提问来源于stack exchange,提问作者Dorian

