How to use JMH with gradle?

后端 未结 5 1864
清歌不尽
清歌不尽 2021-02-04 02:33

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.<

5条回答
  •  萌比男神i
    2021-02-04 02:51

    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.21'
        jmhImplementation 'org.openjdk.jmh:jmh-generator-annprocess:1.21'
    }
    

    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)
    

提交回复
热议问题