How to use JMH with gradle?
gradle, jmh
Solution
Just finished my "masterpiece". No uber-jars, no plugins, code base separated from main & test, benchmarks compilation hooked to main, but does not run automatically in the mainstream lifecycle. Simple, explicit, and hackable, vanilla gradle.
I run it directly from IntelliJ, to run on a box you probably will need the uber-jar back :-)
Before doing it I have spent a fair amount of time trying to get that plugin work, but it's way too clunky for my taste.
Step-by-step breakdown below.
Define a new `sourceSet` called `jmh` with classpath hooked to that of the main `sourceSet`
sourceSets {
jmh {
java.srcDirs = ['src/jmh/java']
scala.srcDirs = ['src/jmh/scala']
resources.srcDirs = ['src/jmh/resources']
compileClasspath += sourceSets.main.runtimeClasspath
}
}
Define dependencies for it (at minimum JMH and its annotation processor).
dependencies {
...
jmhImplementation 'org.openjdk.jmh:jmh-core:1.35'
jmhImplementation 'org.openjdk.jmh:jmh-generator-annprocess:1.35'
}
Define a task `jmh` of type `JavaExec`
task jmh(type: JavaExec, dependsOn: jmhClasses) {
main = 'org.openjdk.jmh.Main'
classpath = sourceSets.jmh.compileClasspath + sourceSets.jmh.runtimeClasspath
}
Hook `jmhClasses` task to run after `classes` to make sure benchmarks are compiled with the rest of the code
classes.finalizedBy(jmhClasses)
Problem
I want to use JMH, an OpenJDK microbenchmark tool, with gradle. However, Im getting the NPE on compilation. On the other hand, JMH works when using from maven. I am not posting any `build.gradle` as it is basic - apply java plugin and add dependency on JHM tool (`org.openjdk.jmh:jmh-core:0.2`). I have tried whats written here without success. What else I have to do? I think something with setting the agent, but I still didnt figure it out. Exception: ``` :compileJava java.lang.NullPointerException at org.openjdk.jmh.processor.internal.GenerateMicroBenchmarkProcessor.validMethodSignature(GenerateMicroBenchmarkProcessor.java:502) ```