Ошибка JMH «Не удалось найти ресурс: /META-INF/BenchmarkList» чаще всего наблюдается, когда мы не настраиваем плагин компилятора на использование процессора аннотаций JMH во время компиляции исходного кода.
1. Проблема
Если мы не включим процессор аннотаций JMH во время компиляции, а затем запустим класс с аннотациями JMH(например, @Benchmark), то получим следующую ошибку во время выполнения:
Exception in thread "main" java.lang.RuntimeException: ERROR: Unable to find the resource: /META-INF/BenchmarkListat 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:253)at org.openjdk.jmh.runner.Runner.run(Runner.java:209)at org.openjdk.jmh.Main.main(Main.java:71)at com.howtodoinjava.core.basic.ForLoopPerformanceTest.main(ForLoopPerformanceTest.java:15)
2. Решение
Чтобы устранить проблему, включите процессор аннотаций JMH в плагин компилятора и пересоберите проект.
<plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><annotationProcessorPaths><path><groupId>org.openjdk.jmh</groupId><artifactId>jmh-generator-annprocess</artifactId><version>1.35</version></path></annotationProcessorPaths></configuration></plugin><plugins>
В Maven для пересборки проекта выполните команду чистой установки:
$ mvn clean install
После того, как мы выполним оба шага и запустим класс бенчмарка JMH, он будет работать нормально.
3. Пример конфигурации JMH
Ниже приведены основные элементы конфигурации и зависимости для JMH в обычном проекте Java. Пожалуйста, проверьте, что вы правильно настроили все части.
<properties><jmh.version>1.35</jmh.version></properties><dependencies><dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-core</artifactId><version>${jmh.version}</version></dependency><dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-generator-annprocess</artifactId><version>${jmh.version}</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><annotationProcessorPaths><path><groupId>org.openjdk.jmh</groupId><artifactId>jmh-generator-annprocess</artifactId><version>${jmh.version}</version></path></annotationProcessorPaths></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.0</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><finalName>benchmarks</finalName><transformers><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>org.openjdk.jmh.Main</mainClass></transformer></transformers></configuration></execution></executions></plugin></plugins></build>
Пожалуйста, напишите в комментариях, сработало ли для вас это решение или нет.