通过@Nested in Gradle缓存对象列表

通过@Nested in Gradle缓存对象列表,gradle,groovy,Gradle,Groovy,我有一个定制的Gradle任务,它为项目生成一个简单的JNLP,但在使任务增量时失败。虽然使用@Nested注释的特定域对象会导致任务在更改时过期,但域对象集合没有任何效果 首先,构建脚本中的任务是这样的: task jnlp(type: JnlpTask) { information { title = "My Project" vendor = "ACME Inc." homepage = "index.html" }

我有一个定制的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()
    }
}
编辑在对资源部分进行更改后,使用info标志运行任务,输出以下内容:

$。/gradlew:jnlp-i
[...]
对所有项目进行评估。
从项目中选择的主要任务“jnlp”:
要执行的任务:[任务]:jnlp']
在.gradle\3.2\taskArtifacts\fileHashes.bin的内存缓存中:大小{1},CacheStats{hitCount=30,missCount=3,loadSuccessCount=3,loadExceptionCount=0,totalLoadTime=3020
680,逐出计数=0}
.gradle\3.2\taskArtifacts\fileSnapshots.bin的内存缓存:大小{22},CacheStats{hitCount=61,missCount=10,loadSuccessCount=10,loadExceptionCount=0,totalLoadTim
e=7833757,驱逐计数=0}
在.gradle\3.2\taskArtifacts\taskArtifacts.bin的内存缓存中:大小{2},CacheStats{hitCount=42,missCount=7,loadSuccessCount=7,loadExceptionCount=0,totalLoadTime=1
0416051,逐出计数=0}
:jnlp(线程[守护进程工作线程12,5,main])已启动。
:jnlp
将任务“:jnlp”的任务工件状态放入上下文需要0.0秒。
任务:jnlp类加载程序哈希:4ac466ecfcbf121c122b8a3606907b63
任务:jnlp操作类加载程序哈希:b9107ff7ae23d58476c42a44166b6e68
正在跳过任务“:jnlp”,因为它是最新的(耗时0.001秒)。
:jnlp最新
:jnlp(线程[守护进程工作线程12,5,main])已完成。花了0.001秒。
由于我对Gradle,尤其是Groovy还比较陌生,所以非常感谢您的任何改进和建议

提前感谢您的帮助

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
    }

}