
本文介绍如何通过配置 maven-jar-plugin 的 skipIfEmpty 参数,彻底消除“JAR will be empty”警告,适用于纯测试项目(如 Cucumber)、无生产代码的 Maven 模块等场景。
本文介绍如何通过配置 `maven-jar-plugin` 的 `skipifempty` 参数,彻底消除“jar will be empty”警告,适用于纯测试项目(如 cucumber)、无生产代码的 maven 模块等场景。
在构建仅包含测试代码(如 Cucumber 集成测试)的 Maven 项目时,项目通常不包含 src/main/java 或 src/main/resources 目录——因为其目标并非产出可发布的库或可执行程序,而是专注运行验证逻辑。然而,默认情况下,Maven 的生命周期(尤其是 verify 阶段)仍会触发 maven-jar-plugin 的 jar 目标,尝试打包 main 目录下的内容。当该目录不存在或为空时,插件会生成一个空 JAR 文件,并输出如下警告:
[WARNING] JAR will be empty - no content was marked for inclusion!
该警告虽不影响测试执行,但污染构建日志、干扰 CI/CD 流水线中的关键信息识别,也违背“零警告”工程实践。
解决方案:启用 skipIfEmpty 安全跳过机制
maven-jar-plugin 自 2.4 版本起支持
在 pom.xml 的
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<skipIfEmpty>true</skipIfEmpty>
</configuration>
</plugin>
</plugins>
</build>✅ 推荐使用最新稳定版(如 3.3.0 或更高),以确保兼容性与安全性;旧版本(如 2.x)虽支持该参数,但可能存在边缘 case 处理缺陷。
⚠️ 注意事项:
- 此配置仅影响 jar 目标(如 mvn package 或 mvn verify 中的默认打包阶段),不会干扰测试执行(surefire/failsafe 插件照常运行);
- 若项目未来需发布主模块(例如增加工具类到 src/main),只需移除该配置或设为 false,无需重构;
- 不要误用
true —— 它会无条件跳过插件,可能破坏依赖传递(如 maven-source-plugin 或 maven-javadoc-plugin 的前置依赖);而 skipIfEmpty 是语义明确、安全可控的条件跳过; - 对于多模块项目,建议在纯测试子模块的 pom.xml 中单独配置,避免影响其他模块。
总结而言,skipIfEmpty=true 是 Maven 官方推荐的、轻量且精准的解决方案,它让构建行为更贴合项目语义:没有主代码,就不应产生主构件。这一配置既保持了构建流程的完整性,又实现了日志的干净与专业性,是测试驱动型 Maven 项目的标准实践之一。










