Java 如何在所有项目中找到特定类型的任务?

Java 如何在所有项目中找到特定类型的任务?,java,gradle,Java,Gradle,我有一个用Gradle构建的多版本Java项目 为了隐藏非法反射访问警告,我想在几个项目中查找JavaExec和测试任务,并提供所需的JVM参数。我不想将这些添加到每个项目中,而是想将其应用到root build.gradle中的所有项目 如何在所有项目中找到特定类型的特定任务 我最初的尝试使用了,但是我想消除重复JavaExec和Test任务类型的重复。见下文: 尝试#1 allprojects { repositories { jcenter() } afterEval

我有一个用Gradle构建的多版本Java项目

为了隐藏非法反射访问警告,我想在几个项目中查找JavaExec和测试任务,并提供所需的JVM参数。我不想将这些添加到每个项目中,而是想将其应用到root build.gradle中的所有项目

如何在所有项目中找到特定类型的特定任务

我最初的尝试使用了,但是我想消除重复JavaExec和Test任务类型的重复。见下文:

尝试#1

allprojects {
  repositories {
    jcenter()
  }

  afterEvaluate {
    project.tasks.withType(JavaExec) {
       it.jvmArgs "--add-opens=java.base/java.lang=ALL-UNNAMED"
    }

    project.tasks.withType(Test) {
        it.jvmArgs "--add-opens=java.base/java.lang=ALL-UNNAMED"
    }
  }
}

subprojects {
  version = "0.0.1-SNAPSHOT"
}
试试这个:

afterEvaluate {
    [JavaExec, Test].each {
        project.tasks.withType(it) {
            it.jvmArgs "--add-opens=java.base/java.lang=ALL-UNNAMED"
        }
    }
}

谢谢你的回答。如果你不介意的话,我可以再解释一下它的工作原理吗?例如,在Gradle中,您如何能够引用任务类型JavaExec和几乎类似于enum的类型?
[JavaExec,Test]
是一个进行迭代的
类的Groovy列表。例如,
[String,Integer]。每个{println it}
都将显示:
class java.lang.String class java.lang.Integer
,所以在Groovy中猜测.class部分可以删除吗?如何通过创建Spec接口的mous实现同样的功能?(通过在TaskCollection类中使用tasks.matching)我并不建议在您的方法中使用它,但我想进一步了解Groovy代码是如何与构建文件集成的。我发现很难理解如何在TaskCollection(将API与构建文件中所需的内容相匹配)之间进行转换。啊,我想我搞错了!这只是为了好玩:这是因为我缺乏常规知识。我在引用JavaExec.class。只是在这里添加了一个要点供参考: