Gradle4.4中TaskInternal.execute()弃用,求更简易的修复方案
嘿,这个问题我之前处理过,其实完全不用费劲去写继承DefaultTask的自定义类,有更简单的适配方式,而且符合Gradle的最佳实践!
Gradle从4.x开始就不推荐直接调用execute()方法了,因为它会打乱Gradle的任务依赖图和生命周期管理,官方更希望我们通过任务依赖或者把逻辑放到任务的action块里来处理。
最稳妥的修改方案(推荐)
把你的配置加载逻辑放到任务的doFirst或者doLast块里,然后让需要用到这个数据库配置的任务依赖它。这样既遵循Gradle的生命周期,又能自动触发配置加载:
task loadDbConfigFromSpringProfile { doFirst { def activeProfileProperties = new Properties() file("src/main/resources/application.properties").withInputStream { activeProfileProperties.load(it) } def profileProperties = new Properties() def activeProfile = activeProfileProperties.getProperty("spring.profiles.active") file("src/main/resources/application-${activeProfile}.properties").withInputStream { profileProperties.load(it) } // 把属性放到项目扩展中,方便其他任务访问 project.ext.active_db_url = profileProperties.getProperty("spring.datasource.url") } } // 假设你需要在run任务中用到这个配置,就让run任务依赖它 tasks.named('run') { dependsOn loadDbConfigFromSpringProfile }
当你执行gradle run时,Gradle会自动先执行loadDbConfigFromSpringProfile任务的doFirst逻辑,加载好配置后再执行run任务,完全不需要手动调用execute()。
简化方案(适合配置阶段加载场景)
如果你的配置不需要延迟加载,只是想在Gradle配置阶段就拿到数据库URL,也可以直接把逻辑抽成方法放到项目根级别:
def loadDbConfig() { def activeProfileProperties = new Properties() file("src/main/resources/application.properties").withInputStream { activeProfileProperties.load(it) } def profileProperties = new Properties() def activeProfile = activeProfileProperties.getProperty("spring.profiles.active") file("src/main/resources/application-${activeProfile}.properties").withInputStream { profileProperties.load(it) } return profileProperties.getProperty("spring.datasource.url") } // 直接绑定到项目扩展属性 project.ext.active_db_url = loadDbConfig()
不过要注意:如果你的application.properties或profile配置文件是由其他任务生成的(比如编译阶段才生成),这种配置阶段加载的方式会出错,此时还是优先用第一种任务依赖的方式更可靠。
总的来说,第一种方案是最通用也最符合Gradle设计理念的,不需要写自定义Task类,改起来简单直接,完美解决execute()弃用的问题。
内容的提问来源于stack exchange,提问作者robert trudel
相关产品推荐
相关产品推荐

