简介
在 Java 开发的日常中,Maven 不仅仅是一个包管理工具,更是一个强大的构建系统。
批量运行指定包下的测试用例
在重构或新增功能时,我们往往只想运行某个特定包下的所有单元测试,而不是全量跑一遍。
命令:
mvn clean test -Dtest='top.csaf.junit.**' -Dsurefire.failIfNoSpecifiedTests=false
解析:
mvn clean test: 标准的 Maven 生命周期。clean清理target目录,确保环境纯净;test运行测试阶段。-Dtest='top.csaf.junit.**': 这是 Maven Surefire Plugin 的核心参数。top.csaf.junit:指定基础包名。**:这是一个通配符,表示递归匹配该包及其所有子包下的所有测试类。- 注:如果是
*则只匹配当前包下的类,不包含子包。
-Dsurefire.failIfNoSpecifiedTests=false: 这是一个非常实用的容错参数。- 默认情况下,如果你指定的模式没有匹配到任何测试类,Maven 会报错并停止构建。
- 设置为
false后,即使没有找到匹配的测试(例如某个子模块下刚好没有这个包),构建也会显示“成功”并跳过,非常适合在多模块项目中批量执行。
多模块项目:单模块测试与覆盖率报告
在大型多模块(Multi-module)项目中,修改了某个底层模块(如 zutil-http),我们希望只测试这个模块并生成 JaCoCo 覆盖率报告,同时确保其依赖也被正确编译。
命令:
mvn test -pl zutil-http -am -Dtest=HttpUtilTest -Dsurefire.failIfNoSpecifiedTests=false && mvn jacoco:report -pl zutil-http
解析:
这条命令由两部分组成,中间用 && 连接,意味着只有前半部分成功(测试通过),才会执行后半部分(生成报告)。
第一部分:编译与测试
-pl zutil-http(--projects): 指定本次构建的目标模块列表。这里只构建zutil-http模块。-am(--also-make): 关键参数。同时构建指定模块所依赖的其他模块。这保证了如果zutil-http依赖了zutil-core,Maven 会先编译zutil-core,防止因找不到依赖而报错。-Dtest=HttpUtilTest: 精确指定运行某一个测试类HttpUtilTest。-Dsurefire.failIfNoSpecifiedTests=false: 同上,防止因未找到测试而报错。
第二部分:生成报告
mvn jacoco:report: 调用 JaCoCo 插件生成代码覆盖率报告(通常生成在target/site/jacoco/index.html)。-pl zutil-http: 同样指定只为该模块生成报告。
一键升级依赖与插件版本(过滤不稳定版本)
项目维护久了,pom.xml 中的依赖版本往往会滞后。使用 versions-maven-plugin 可以自动化升级过程,同时我们可以通过正则过滤掉 alpha、beta 等不稳定版本。
命令:
mvn versions:use-latest-releases versions:update-properties -DgenerateBackupPoms=false -Dmaven.version.ignore=".*(?i)(alpha|beta|android).*"
解析:
versions:use-latest-releases: 尝试将<dependencies>中的依赖升级到最新的 Release 版本。versions:update-properties: 尝试更新<properties>标签中定义的版本号。这是管理插件版本和统一依赖版本的最佳实践。-DgenerateBackupPoms=false: 默认情况下,该插件会生成pom.xml.versionsBackup备份文件。设置为false表示直接修改原pom.xml,保持工作区整洁(反正我们有 Git)。-Dmaven.version.ignore=".*(?i)(alpha|beta|android).*": 核心过滤参数。- 这是一个正则表达式,用于忽略不需要的版本。
(?i):开启不区分大小写模式。(alpha|beta|android):匹配包含这些关键词的版本号。- 效果:Maven 在搜索最新版本时,会自动跳过
2.0.0-beta1、1.5.0-alpha这种非正式版本,只选择正式发行的 Release 版本。
评论区