如何在Gradle任务中获取Windows域名以切换数据库配置?
在Build.gradle中根据运行环境切换数据库配置的可行方案
方案一:正确配置并读取系统属性
你之前用System.getProperty("test.property")返回null,大概率是没有在运行Gradle时正确传递系统属性。
传递系统属性的方式
- 命令行运行Gradle:
其中./gradlew build -Dtest.property=devdev可替换为local,如果不传递该参数,可设置默认值:def env = System.getProperty("test.property", "local") def dbUrl = env == "dev" ? "jdbc:mysql://dev-server:3306/your_db" : "jdbc:mysql://localhost:3306/your_db" - IDE运行(如IntelliJ):
在Run Configuration的VM options中添加:-Dtest.property=dev,保存后再运行即可读取到属性值。
方案二:使用环境变量(System.getenv())
环境变量适合在不同系统或CI环境中全局配置,无需每次运行Gradle都传参。
实现步骤
- 在系统中设置环境变量:
- Windows:
set DB_ENV=dev - Linux/macOS:
export DB_ENV=dev
也可以在IDE的Run Configuration的Environment Variables中添加键值对DB_ENV=dev。
- Windows:
- 在build.gradle中读取并配置:
def dbEnv = System.getenv("DB_ENV") ?: "local" // 定义不同环境的数据库配置 def dbConfigs = [ local: [url: "jdbc:mysql://localhost:3306/your_db", user: "local_user", password: "local_pass"], dev: [url: "jdbc:mysql://dev-server:3306/your_db", user: "dev_user", password: "dev_pass"] ] // 将配置传递给Java任务 tasks.withType(JavaExec) { systemProperty "db.url", dbConfigs[dbEnv].url systemProperty "db.user", dbConfigs[dbEnv].user systemProperty "db.password", dbConfigs[dbEnv].password }
方案三:通过Gradle项目属性传递
这是更贴合Gradle生态的方式,和系统属性区分开,避免命名冲突。
使用方式
- 命令行传递:
./gradlew build -PdbEnv=dev - build.gradle中读取:
def dbEnv = project.findProperty("dbEnv") ?: "local" // 后续配置逻辑同方案二
方案四:自动识别主机名/IP(无需手动传参)
如果想实现完全自动切换,可以通过读取运行机器的主机名或IP来判断环境:
def dbEnv = "local" try { // 通过主机名判断 def hostname = InetAddress.getLocalHost().getHostName() // 根据实际开发服务器的主机名匹配 if (hostname == "dev-server-01" || hostname.endsWith(".dev-domain.com")) { dbEnv = "dev" } // 也可以通过IP段判断 // def ip = InetAddress.getLocalHost().getHostAddress() // if (ip.startsWith("10.0.2.")) dbEnv = "dev" } catch (UnknownHostException e) { logger.warn("Failed to resolve hostname, fallback to local DB config") } // 应用数据库配置 def dbUrl = dbEnv == "dev" ? "jdbc:mysql://dev-server:3306/your_db" : "jdbc:mysql://localhost:3306/your_db"
内容的提问来源于stack exchange,提问作者sachyy
相关产品推荐
相关产品推荐

