java - gradle WriteProperties 任务不会创建属性文件,除非直接运行该任务
问题描述
我正在尝试在非 Android Java 项目中生成属性文件,但由于某种原因,即使在我使用构建项目./gradlew assembleDist
或使用它运行时任务运行./gradlew foo:run
,也不会创建属性文件。该任务在子项目中定义,如下所示:
task writeProperties(type: WriteProperties) {
outputFile 'src/main/resources/foo.properties'
property 'version', version
property 'releaseType', releaseType
property 'date', date
println("task ran")
}
task ran
当我执行其他 gradle 任务时打印出来,表明任务已运行,但foo.properties
指定路径中没有显示文件。奇怪的是,如果我writeProperties
直接使用 运行任务./gradlew foo:writeProperties
,文件将被创建并填充正确的变量。
我试过用上面的语句包装doFirst{}
,doLast{}
但我得到如下错误:
Cause: path may not be null or empty string. path='null'
有谁知道我做错了什么?几个小时以来,我一直在努力解决这个问题,但我的想法已经不多了。谢谢!
更新:我设法用接受的答案中提供的信息解决了这个问题。我必须添加compileJava.finalizedBy(writeProperties)
才能让任务作为构建任务的一部分实际运行。正如上面提到的答案,println
本质上是对我撒谎,因为这是在配置阶段打印的,但没有运行任务操作。
解决方案
您的代码的实际问题是您的println
陈述没有说实话。任务配置闭包中的代码在配置任务时运行,而不是在执行时运行。因此,每次您从命令行运行另一个任务时,您的任务都会被配置并println
写入命令行,但不会执行实际的任务操作。您应该将您的文件打包println
成doLast
,以便它在.properties
文件创建后实际运行。
task myTask {
println 'task configured'
doLast {
println 'task executed'
}
}
如果您希望您的任务在没有在命令行中指定的情况下运行,您需要使用dependsOn
或设置任务依赖项finalizedBy
。
推荐阅读
- python - 如何在后台运行一个永远循环
- hdf5 - 如何读取 hdf5 (Hdfsl) 文件(一列读取)读取(大尺寸文件)
- ef-code-first - System.InvalidOperationException:在 SqlServer 提供程序清单中找不到存储类型“十进制(18,4)”
- node.js - 如何在 Node js 中解析请求
- mysql - 生成表上不存在的随机数,然后在 MySQL 上的 concat 函数上使用它
- php - 无法获得 formated_address 'only in English' 获得区域语言的部分结果
- python-3.x - 加载预训练的词嵌入
- azure-active-directory - Microsoft Graph API 用户和 WindowsIdentity 之间是否有任何联系?
- javascript - 用户地理位置点(蓝点)不再出现在我的 IOS 应用程序上(适用于 Android 应用程序)
- javascript - 如何合并对象数组