-p 是 gradle 命令行参数,用于设置高优先级项目属性,格式为 -pkey=value;可通过 project.findproperty("key") 安全读取,在 build.gradle 中用于环境切换、占位符替换等构建逻辑控制。

在 Java 项目中使用 Gradle 时,gradlew(Gradle Wrapper)支持通过 -P 参数动态传入项目属性(Project Properties),这些属性可在 build.gradle 或 settings.gradle 中读取并用于控制构建逻辑、替换占位符、切换环境等。
什么是 -P 参数?
-P 是 Gradle 的命令行选项,用于设置 project property(项目属性),格式为 -Pkey=value。它优先级高于 gradle.properties 中的同名属性,但低于 System.setProperty() 或 project.ext 的硬编码赋值(需注意作用时机)。
例如:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
./gradlew build -Penv=prod -PversionName=1.2.3
在 build.gradle 中读取和使用 -P 参数
项目属性可通过 project.findProperty("key") 安全读取(推荐),或直接用 project.property("key")(若属性不存在会抛异常)。
- 安全方式(推荐):
def env = project.findProperty("env") ?: "dev" def versionName = project.findProperty("versionName") ?: "1.0.0-SNAPSHOT" - 配合构建逻辑使用:
if (env == "prod") { tasks.withType(JavaCompile) { options.encoding = "UTF-8" options.compilerArgs - 传递给插件或任务:
android { defaultConfig { buildConfigField "String", "ENV", "\"${env}\"" versionName versionName } }
常见使用场景与注意事项
-
区分构建环境:如
-Penv=test控制资源过滤、API 地址、日志级别等 -
动态版本号:CI 流水线中传入 Git Tag 或构建号:
./gradlew assembleRelease -PversionCode=102 -PversionName=2.1.0 -
跳过耗时任务:如
-PskipTests=true配合if (!project.hasProperty("skipTests") || !project.property("skipTests").toBoolean()) { test {} } -
避免空格/特殊字符问题:值含空格时需加英文双引号,如
-PappName="My App" -
不能直接覆盖 ext 属性:若脚本中已定义
ext.version = "1.0",-Pversion=2.0不会自动覆盖它;需显式赋值:ext.version = findProperty("version") ?: ext.version
验证参数是否生效的小技巧
临时添加一个调试任务快速确认:
task printProps {
doLast {
println "env = ${findProperty("env")}"
println "versionName = ${findProperty("versionName")}"
println "all props: ${project.properties.keySet().intersect(["env", "versionName", "skipTests"])}"
}
}
然后运行:./gradlew printProps -Penv=staging -PversionName=1.5.0
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










