命令行设置build.gradle中bootJar.enabled参数不生效问题求助
在不同构建场景下需要将bootJar.enabled设为false或true,不想维护两个build.gradle文件或用繁琐的sed注入方式,于是在build.gradle中编写了如下逻辑:
bootJar { if(project.hasProperty("doBootJar")) { println "found doBootJar: ${project.getProperty("doBootJar")}"; enabled = project.getProperty("doBootJar"); } else { println "default doBootJar"; enabled = true; } println "enabled: ${enabled}"; }
预期执行gradle clean build时enabled设为true;执行gradle -PdoBootJar="false" clean build时enabled设为false;执行gradle -PdoBootJar="true" clean build时enabled设为true。但实际输出显示,无论传入true还是false,enabled始终为true。if/else逻辑能正确识别参数是否存在,也能读取到参数值,但enabled未正确设置,请问忽略了什么?
问题根源
通过-P传递的参数默认是字符串类型,而Gradle中bootJar.enabled是布尔类型。在Groovy中,将非空字符串赋值给布尔变量时,会被统一解析为true——哪怕字符串内容是"false",只要它不是空字符串,都会被判定为布尔true,这就是你遇到的问题。
修复方案
只需要把读取到的字符串参数转换为布尔类型即可,有两种常用方式:
方案1:使用Groovy的toBoolean()方法
修改后的代码如下:
bootJar { if (project.hasProperty("doBootJar")) { def doBootJarValue = project.getProperty("doBootJar") println "found doBootJar: ${doBootJarValue}" // 将字符串转为布尔值 enabled = doBootJarValue.toBoolean() } else { println "default doBootJar" enabled = true } println "enabled: ${enabled}" }
"true".toBoolean()会返回true,"false".toBoolean()会返回false,完全符合你的预期。
方案2:传递参数时不加引号(依赖命令行解析)
如果你的命令行shell支持,可以直接传递不带引号的布尔值:
gradle -PdoBootJar=false clean build
这种情况下Gradle会自动将参数识别为布尔类型,无需手动转换,代码可以保持你原来的写法。不过这种方式在部分shell环境下可能有兼容性问题,推荐优先使用方案1。
内容的提问来源于stack exchange,提问作者Smrt

