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