1、背景
我在执行maven编译时,遇到下面情况:
1、当执行命令为下面:
mvn clean compile package install -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true -Drat.numUnapprovedLicenses=600 -DskipTests=true -pl=hdfs-agent -Pall -Pbuild-repo
发现还是会编译测试模块的代码,如下图:
2、而变成下面命令时,便不会编译测试模块的代码了
mvn clean compile package install -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true -Drat.numUnapprovedLicenses=600 -Dmaven.test.skip=true -pl=hdfs-agent -Pall -Pbuild-repo
2、-Dmaven.test.skip=true和-DskipTests=true的区别
-Dmaven.test.skip=true
和 -DskipTests
都是用于跳过测试的 Maven 参数,但它们有细微的区别
(1)-Dmaven.test.skip=true
- 跳过测试编译和执行:使用这个参数,Maven 会完全跳过测试的编译和执行过程。这意味着测试代码不会被编译,也不会运行任何测试用例。
- 影响范围:更为全局。它不仅跳过 Surefire 插件(用于单元测试)的执行,还会跳过其他可能运行测试的插件(如 Failsafe 插件,用于集成测试)。
示例命令:
mvn clean package -Dmaven.test.skip=true
(2)-DskipTests
- 仅跳过测试执行:使用这个参数,Maven 仍然会编译测试代码,但不会运行测试用例。测试类会被编译并包含在构建输出中,但不会被执行。
- 影响范围:主要影响 Surefire 和 Failsafe 插件的执行。如果你的构建流程中有其他插件依赖于测试代码的编译,使用这个选项会比较安全,因为测试代码仍然会被编译。
示例命令:
mvn clean package -DskipTests
(3)详细对比
-
测试代码编译:
-Dmaven.test.skip=true
:测试代码不会被编译。-DskipTests
:测试代码会被编译,但不会被执行。
-
插件影响:
-Dmaven.test.skip=true
:会影响所有插件,不仅仅是 Surefire 和 Failsafe 插件。-DskipTests
:主要影响 Surefire 和 Failsafe 插件的执行,但测试代码仍会被编译。
-
适用场景:
-Dmaven.test.skip=true
:在你确实不需要测试代码的情况下使用,例如快速构建生产版本。-DskipTests
:在你需要测试代码编译但不需要执行测试的情况下使用,例如开发阶段需要快速构建但仍然希望确保测试代码编译通过。
3、结论
- 快速跳过所有测试相关的步骤:使用
-Dmaven.test.skip=true
。 - 仅跳过测试执行但保留测试代码编译:使用
-DskipTests
。
希望这些解释能够帮大家更好地理解这两个参数的区别,并根据需求选择合适的选项。