JMH and JDK 22

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Tue Oct 31 15:18:32 UTC 2023


Hi Jaikiran,
I'm aware of the issue you mention. To clarify, here I'm talking about 
benchmarks that live _outside_ the JDK (which is arguably a common case).

What my pom file changes do is morally equivalent to the JDK build 
changes linked in your JBS issue.

Maurizio

On 31/10/2023 15:16, Jaikiran Pai wrote:
>
> Hello Maurizio,
>
> We had this issue in our JDK repo which has micro benchmarks. Running 
> those micro benchmarks had run into this issue. We decided to use the 
> "-processor org.openjdk.jmh.generators.BenchmarkProcessor" instead of 
> -proc:full to get this to work. More details are available here 
> https://github.com/openjdk/jdk/pull/16122
>
> -Jaikiran
>
> On 31/10/23 7:44 pm, Maurizio Cimadamore wrote:
>>
>> Hi,
>> earlier today I ran into an issue when trying to run a JMH benchmark 
>> on a 3rd party maven project.
>>
>> It seems like the issue is caused by the change in javac’s default 
>> annotation processing policy [1].
>>
>> Here are the steps to reproduce the issue:
>>
>>   * set JAVA_HOME to point to a recent JDK 22 build
>>   * generate a JMH sample pom file using the following command (this
>>     is what is advertised in the JMH github page [2]):
>>
>> |$ mvn archetype:generate \ -DinteractiveMode=false \ 
>> -DarchetypeGroupId=org.openjdk.jmh \ 
>> -DarchetypeArtifactId=jmh-java-benchmark-archetype \ 
>> -DgroupId=org.sample \ -DartifactId=test \ -Dversion=1.0 |
>>
>>   * build the project using |mvn clean package|
>>   * run the benchmark as follows:
>>
>> |$ $JAVA_HOME/bin/java -jar target/benchmarks.jar MyBenchmark 
>> Exception in thread "main" java.lang.RuntimeException: ERROR: Unable 
>> to find the resource: /META-INF/BenchmarkList at 
>> org.openjdk.jmh.runner.AbstractResourceReader.getReaders(AbstractResourceReader.java:98) 
>> at org.openjdk.jmh.runner.BenchmarkList.find(BenchmarkList.java:124) 
>> at org.openjdk.jmh.runner.Runner.internalRun(Runner.java:252) at 
>> org.openjdk.jmh.runner.Runner.run(Runner.java:208) at 
>> org.openjdk.jmh.Main.main(Main.java:71) |
>>
>> As you can see, there is a problem here, as the META-INF folder does 
>> not contain the list of benchmarks. This is due to the fact that 
>> annotations are no longer processed using processors available in the 
>> classpath. Using JDK 21 to build and run the same pom file works fine.
>>
>> Adding the following lines to the compiler plugin configuration 
>> addresses the issue in JDK 22:
>>
>> |<compilerArgs> <arg>-proc:full</arg> </compilerArgs> |
>>
>> While this is understandable, I’m afraid that not many users will 
>> have gotten the memo - I don’t seem to get any notes when building 
>> this project using JDK 21 (probably the notes are swallowed by 
>> maven?). And, sadly, the lack of a proper JMH plugin means that all 
>> the JMH poms out there will need some manual tweaking to keep working 
>> in 22.
>>
>> At the very least, I think that JMH’s maven archetype should be 
>> updated to include the lines above?
>>
>> Cheers
>> Maurizio
>>
>> [1] - https://github.com/openjdk/jdk/pull/14432
>> [2] - https://github.com/openjdk/jmh
>>
>>-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/compiler-dev/attachments/20231031/1ba77e90/attachment-0001.htm>


More information about the compiler-dev mailing list