Maven模块化项目Log4j类缺失致JUnit测试失败求助
问题描述
我在项目中添加了Log4j的可选依赖:
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.19.0</version> <optional>true</optional> </dependency>
同时在module-info.java中添加了静态依赖声明:
requires static org.apache.logging.log4j; requires static org.apache.logging.log4j.core;
非模块化构建时一切正常,但模块化构建下JUnit测试执行失败。添加-e参数到Maven命令后,错误栈核心问题是找不到org.apache.logging.log4j.util.Supplier类。
排查细节:
- 用
-X参数确认,编译和测试阶段的模块路径中都包含Log4j的API和core模块,且该类确实存在于对应JAR包中 - 尝试添加
--add-opens参数,提示未知模块 - 给maven-compiler-plugin设置
<release>11</release>也无法解决问题 - 本地和GitHub Action中均会出现该错误
解决方案
1. 补充Log4j API的可选依赖
org.apache.logging.log4j.util.Supplier属于Log4j API模块,而非core模块。当前依赖仅添加了core,需补充API的可选依赖:
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.19.0</version> <optional>true</optional> </dependency>
2. 调整测试阶段的依赖范围
静态依赖(requires static)仅保证编译时可用,运行时不会自动引入。JUnit测试运行时需显式引入Log4j依赖,添加测试范围的依赖配置:
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.19.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.19.0</version> <scope>test</scope> </dependency>
3. 配置Maven Surefire插件确保模块路径正确
Maven Surefire插件运行测试时,可能未正确加载模块路径。显式配置插件,强制引入Log4j模块:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.1.2</version> <configuration> <argLine>--add-modules org.apache.logging.log4j,org.apache.logging.log4j.core</argLine> </configuration> </plugin>
4. 调整模块声明的依赖类型
如果测试代码直接依赖Log4j的类,静态依赖无法满足运行时需求。可将测试模块的module-info.test.java(若存在)中的依赖改为非静态:
requires org.apache.logging.log4j; requires org.apache.logging.log4j.core;
内容的提问来源于stack exchange,提问作者Rob Spoor
相关产品推荐
相关产品推荐

