Java gradle WriteProperties任务不会创建属性文件,除非直接运行该任务
我试图在非Android Java项目中生成属性文件,但由于某种原因,即使在我使用Java gradle WriteProperties任务不会创建属性文件,除非直接运行该任务,java,gradle,Java,Gradle,我试图在非Android Java项目中生成属性文件,但由于某种原因,即使在我使用/gradlew assembleList构建项目或使用/gradlew foo:run运行项目时任务运行,也不会创建属性文件。任务在子项目中定义,如下所示: task writeProperties(type: WriteProperties) { outputFile 'src/main/resources/foo.properties' property 'version', version
/gradlew assembleList
构建项目或使用/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")
}
当我执行其他gradle任务时,task run
会被打印出来,这表明该任务已运行,但指定路径中没有显示任何foo.properties
文件。奇怪的是,如果我直接使用/gradlew foo:writeProperties
运行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
Hi-Algebro来设置任务依赖项,欢迎使用stackoverflow。我试过你的代码,它对我很有效。你能回答你的问题并提供一个答案吗?另请参阅。您的答案中有太多不必要的噪音,问题代码中的实际问题根本没有解释。谢谢您的解释。有没有办法指定项目的编译任务依赖于此任务?我需要将该属性文件写入jar并绑定到jar中,但我不知道如何将其设置为依赖项。如果希望结果文件出现在jar
任务生成的jar文件中,只需将jar{from writeProperties}
添加到build.gradle
。Gradle将自动创建任务依赖项,以便在创建JAR文件时执行任务。此外,您不需要(也不应该)在src/main/resources
中创建属性文件。源集(src下的所有内容)仅适用于源文件,不适用于生成的文件。生成的资源文件的建议路径在哪里?对于所有的初学者问题,我深表歉意——我对Java项目布局非常陌生,正在尝试学习以正确的方式进行操作。此外,将从writeProperties
添加到jar{}
会给我带来以下错误:评估项目时出现问题:foo'>无法获取任务的未知属性“writeProperties”:类型为org.gradle.api.tasks.bundling.jar的foo:jar代码>
task myTask {
println 'task configured'
doLast {
println 'task executed'
}
}