JMH and JDK 22
Jaikiran Pai
jai.forums2013 at gmail.com
Tue Oct 31 15:27:11 UTC 2023
On 31/10/23 8:48 pm, Maurizio Cimadamore wrote:
>
> 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).
>
Noted.
>
> What my pom file changes do is morally equivalent to the JDK build
> changes linked in your JBS issue.
>
I didn't word my previous reply clearly. What I meant to say was, if the
jmh archetype generator gets updated to by default add the option, then
I think it would be better to only enable the specific annotation
processor using the -processor option instead of -proc:full. That way it
won't end up enabling all other annotation processors that might be on
the classpath (which is what I believe was the motivation behind not
enabling the annotation processors by default).
-Jaikiran
> 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/e31d1f1d/attachment-0001.htm>
More information about the compiler-dev
mailing list