我有一个自定义Gradle任务,它为项目生成一个简单的JNLP,并使任务增量失败。虽然使用@Nested
注释的特定域对象导致任务在更改时过期,但域对象集合不起作用。
首先,这就是构建脚本中的任务:
task jnlp(type: JnlpTask) {
information {
title = "My Project"
vendor = "ACME Inc."
homepage = "index.html"
}
application {
mainClass = "com.acme.project.MainFrame"
args = [443, "administration"]
}
resources {
j2se version:"1.7+", maxHeapSize:"256M", initialHeapSize:"32M", vmArgs:"-Dfile.encoding=Cp850"
jar href: "project.jar", main:true
jar href: "lib.jar", download: "eager"
}
resources(os: "Windows", arch:"x64") {
nativelib href: "winlib-native-64.jar", download: "eager"
}
}
这是任务实现本身:
package com.acme.build
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.InputDirectory;
import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.Nested
class JnlpTask extends DefaultTask {
@Nested
ApplicationDescription appDesc
@Input
Map<String, String> information = [:]
@Nested
List<JnlpResourceContainer> resources = []
@TaskAction
def writeJnlp() {
new XmlWriter().write(this)
}
def application(Closure cl) {
appDesc = new ApplicationDescription()
apply appDesc, cl
}
def information(Closure cl) {
apply information, cl
}
def resources(Map params = [:], Closure cl) {
def container = new JnlpResourceContainer()
container.setParams(params)
apply container, cl
resources << container
}
def apply(def object, Closure cl) {
cl.delegate = object
cl.resolveStrategy = Closure.DELEGATE_FIRST
cl()
}
}
使用ApplicationDescription
对象的更改,即修改application
部分中的参数时。但是当我向 resources
部分添加库时,构建仍然标记为最新,尽管JnlpResourceContainer
中的属性是使用适当的缓存类型进行注释(类Resource
仅使用@Input
仅注释两个属性:
package com.acme.build
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Nested
class JnlpResourceContainer {
@Nested
List<Resource> resources = []
@Input
Map params = [:]
def j2se(Map params) {
addResource('j2se', params)
}
def jar(Map params) {
addResource('jar', params)
}
def nativelib(Map params) {
addResource('nativelib', params)
}
def addResource(String type, Map params) {
def resource = new Resource()
resource.setType(type)
params.each() {k,v ->
k = k.replaceAll(/([A-Z])/, /-$1/).toLowerCase()
resource.params[k] = v
}
resources << resource
}
}
编辑在对资源部分进行更改后,使用info标志运行任务会输出以下内容:
$ ./gradlew :jnlp -i
[...]
All projects evaluated.
Selected primary task 'jnlp' from project :
Tasks to be executed: [task ':jnlp']
In-memory cache of .gradle\3.2\taskArtifacts\fileHashes.bin: Size{1}, CacheStats{hitCount=30, missCount=3, loadSuccessCount=3, loadExceptionCount=0, totalLoadTime=3020
680, evictionCount=0}
In-memory cache of .gradle\3.2\taskArtifacts\fileSnapshots.bin: Size{22}, CacheStats{hitCount=61, missCount=10, loadSuccessCount=10, loadExceptionCount=0, totalLoadTim
e=7833757, evictionCount=0}
In-memory cache of .gradle\3.2\taskArtifacts\taskArtifacts.bin: Size{2}, CacheStats{hitCount=42, missCount=7, loadSuccessCount=7, loadExceptionCount=0, totalLoadTime=1
0416051, evictionCount=0}
:jnlp (Thread[Daemon worker Thread 12,5,main]) started.
:jnlp
Putting task artifact state for task ':jnlp' into context took 0.0 secs.
Task :jnlp class loader hash: 4ac466ecfcbf121c122b8a3606907b63
Task :jnlp actions class loader hash: b9107ff7ae23d58476c42a44166b6e68
Skipping task ':jnlp' as it is up-to-date (took 0.001 secs).
:jnlp UP-TO-DATE
:jnlp (Thread[Daemon worker Thread 12,5,main]) completed. Took 0.001 secs.
由于我是Gradle的新手,尤其是Groovy,我们对任何改进和建议表示赞赏。
提前感谢您的帮助!