自定义Gradle任务传递属性至单元测试失败,System.getProperty返回null问题排查
问题分析与解决方案
咱们来一步步拆解你遇到的问题,找到核心原因和解决办法:
1. 重复任务注册的冲突问题
你同时用两种方式定义了withFeature任务:
- 先用
task("withFeature", JavaExec::class)完整定义了一个JavaExec类型的任务 - 又用
tasks.register("withFeature")重复注册了同名任务
这会导致Gradle任务定义冲突,直接删掉tasks.register("withFeature")这一行,保留第一个完整的任务定义即可。
2. 测试任务未配置属性传递逻辑
你通过-Pfeature=default传入的是Gradle项目属性,但单元测试运行在独立的JVM进程中,不会自动继承Gradle的项目属性。而你的测试代码用System.getProperty("feature")读取的是JVM系统属性,两者不是同一个概念,这就是为什么你拿到null的核心原因。
解决方法:给test任务配置属性传递
在你的Gradle配置文件(比如feature.gradle或者主build.gradle)中,添加对test任务的配置,把Gradle的feature项目属性映射为测试JVM的系统属性:
test { // 如果传入了feature属性就用它,否则用默认值"default" systemProperty "feature", project.findProperty("feature") ?: "default" }
配置完成后,执行以下命令:
./gradlew test -Pfeature=default
此时测试代码里的System.getProperty("feature")就能正确拿到"default"值了。
额外补充:如果想通过withFeature触发测试
如果你本来是想通过withFeature任务触发测试并传递参数,可以给withFeature添加对test任务的依赖,确保执行顺序和属性传递:
task("withFeature", JavaExec::class) { group = "myCustomTasks" main = "com.example.calculator" classpath = sourceSets["main"].runtimeClasspath args(project.findProperty("feature") ?: "default") // 让withFeature执行前先跑test任务 dependsOn(test) }
之后执行:
./gradlew withFeature -Pfeature=default
这样既会运行能拿到参数的测试任务,也会执行你的JavaExec任务。
内容的提问来源于stack exchange,提问作者AShX
相关产品推荐
相关产品推荐

