Java 如何在gradle构建中拥有多个任务配置?

Java 如何在gradle构建中拥有多个任务配置?,java,gradle,build,jmh,Java,Gradle,Build,Jmh,我目前正在使用一个插件在Java代码上运行基准测试,我曾经这样做过 该插件允许使用JMH代码块方便地描述JMH配置: jmh { include = ["List"] benchmarkParameters=["seed": ["1", "2", "3", "4", "5"], "applicationSize&qu

我目前正在使用一个插件在Java代码上运行基准测试,我曾经这样做过

该插件允许使用
JMH
代码块方便地描述JMH配置:

jmh {
    include = ["List"]
    benchmarkParameters=["seed": ["1", "2", "3", "4", "5"],
        "applicationSize":["100", "1000"],
        "baseStructureSize":["100", "1000"]]
    fork=2
    timeOnIteration="250ms"
    iterations=2
    warmup="250ms"
    warmupIterations=2
    fork=2
    resultFormat="CSV"
    benchmarkMode=["ss"]
    timeUnit="ms"
    failOnError = true
}
这很有用,但我希望有不同类型的相同任务,例如,一个输出是CSV,一个输出是JSON。我知道这可以通过
resultFormat=
进行配置,但是我找不到一种方法来“复制”任务,并且对每个变量都有不同的配置

有关配置任务,但它们配置了
Copy
任务。我想我也可以用类似的方法写:

task myJMH(type: me.champeau.gradle.JMHTask) {
    resultFormat="JSON"
}
但正如我在文章中提到的,这种方法不起作用。我想可能是JMH的任务不同。注册该名称的类是可行的,但无法对其进行配置。我得到以下错误:

Could not set unknown property 'include' for task ':myJMH' of type me.champeau.gradle.JMHTask.

类似地,我希望拥有
shadowJar任务的各种配置,以便能够生成任务的几种不同变体,但我遇到了相同的问题。

第一个示例中的
jmh
不是任务,而是扩展。该插件使用相同的名称注册扩展和任务。实际上,这是Gradle插件的一种流行模式

通常,即使插件创建的任务可以使用扩展配置,也可以直接配置它们,因为它们仍然提供配置属性。任务类型为
ShadowJar
,因此您可以:

遗憾的是,任务类型
JMHTask
的实现方式只是从扩展中检索配置,因此任何实例都将使用相同的配置

但是,您可以尝试以下解决方法:

创建配置扩展的任务,然后将它们与
jmh
任务关联起来执行:

jmh {
    include = ["List"]
    benchmarkParameters=["seed": ["1", "2", "3", "4", "5"],
        "applicationSize":["100", "1000"],
        "baseStructureSize":["100", "1000"]]
    fork=2
    timeOnIteration="250ms"
    iterations=2
    warmup="250ms"
    warmupIterations=2
    fork=2
    benchmarkMode=["ss"]
    timeUnit="ms"
    failOnError = true
}

task jmhCsv {
    doFirst {
        jmh.resultFormat="CSV"
    }
    finalizedBy 'jmh'
}

task jmhJson {
    doFirst {
        jmh.resultFormat="JSON"
    }
    finalizedBy 'jmh'
}

请注意,一个任务在生成中只能执行一次,因此,如果您希望在同一次运行中运行不同的配置,则此解决方案将不起作用。

第一个示例中的
jmh
不是一个任务,而是一个扩展。该插件使用相同的名称注册扩展和任务。实际上,这是Gradle插件的一种流行模式

通常,即使插件创建的任务可以使用扩展配置,也可以直接配置它们,因为它们仍然提供配置属性。任务类型为
ShadowJar
,因此您可以:

遗憾的是,任务类型
JMHTask
的实现方式只是从扩展中检索配置,因此任何实例都将使用相同的配置

但是,您可以尝试以下解决方法:

创建配置扩展的任务,然后将它们与
jmh
任务关联起来执行:

jmh {
    include = ["List"]
    benchmarkParameters=["seed": ["1", "2", "3", "4", "5"],
        "applicationSize":["100", "1000"],
        "baseStructureSize":["100", "1000"]]
    fork=2
    timeOnIteration="250ms"
    iterations=2
    warmup="250ms"
    warmupIterations=2
    fork=2
    benchmarkMode=["ss"]
    timeUnit="ms"
    failOnError = true
}

task jmhCsv {
    doFirst {
        jmh.resultFormat="CSV"
    }
    finalizedBy 'jmh'
}

task jmhJson {
    doFirst {
        jmh.resultFormat="JSON"
    }
    finalizedBy 'jmh'
}
请注意,一个任务在生成中只能执行一次,因此,如果您希望在同一次运行中运行不同的配置,则此解决方案将不起作用