我目前正在使用插件在 Java 代码上运行基准测试,我使用了 jmh-gradle-plugin要做到这一点。
该插件允许使用 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=<format>
,但我找不到“复制”任务并为每个变体提供不同配置的方法。Gradle documentation has a page关于配置任务,但是他们配置了
Copy
任务。我想我可以遵循类似的方法并写:task myJMH(type: me.champeau.gradle.JMHTask) {
resultFormat="JSON"
}
但是方法不起作用,正如我在 this issue 中提到的那样.我认为这可能是 JMH 的任务不同。注册一个具有该名称的类是可行的,但无法配置它。我收到以下错误:Could not set unknown property 'include' for task ':myJMH' of type me.champeau.gradle.JMHTask.
同样,我想要 shadowJar
的各种配置任务,能够生成任务的几个不同变体,但我遇到了同样的问题。
最佳答案
jmh
在您的第一个示例中,它不是任务,而是扩展。该插件注册了一个扩展名和一个同名的任务。实际上,这是 Gradle 插件的流行模式。
通常,即使插件创建的任务可以使用扩展配置,仍然可以直接配置它们,因为它们仍然提供配置属性。任务类型 ShadowJar
就是这种情况。 , 所以你可以 simply create tasks of that type manually :
// Shadowing Test Sources and Dependencies
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
task testJar(type: ShadowJar) {
classifier = 'tests'
from sourceSets.test.output
configurations = [project.configurations.testRuntime]
}
可悲的是,任务类型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'
}
请注意,一个任务只能在构建中执行一次,因此如果您想在同一运行中运行不同的配置,此解决方法将不起作用。
关于java - 如何在 gradle 构建中有许多任务配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63379024/