JMH не работает в Eclipse (как проект Maven) - нет тестов для запуска

Я хочу начать взглянуть на JMH, и я не могу запустить тесты по некоторым причинам. Позвольте мне объяснить, что я пытался:

  1. настройка проекта maven в Eclipse
  2. определить pom.XML, например: enter image description here

  3. скачал некоторые официальные примеры JMH. В качестве примера я выбрал, что довольно просто и хорошее место для начать: http://hg.openjdk.java.net/code-tools/jmh/file/0c58dc4fcf17/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_01_HelloWorld.java

  4. щелкните правой кнопкой мыши > выполнить как > Java Application

однако это приводит к выходу:

Exception in thread "main" No benchmarks to run; check the include/exclude regexps.
at org.openjdk.jmh.runner.Runner.run(Runner.java:155)
at org.openjdk.jmh.samples.JMHSample_01_HelloWorld.main(JMHSample_01_HelloWorld.java:90)

у меня есть googled, и кажется, что приведенный выше пример должен работать, но это не так для меня. Я также попытался решить проблему, прочитав, но это, похоже, не работает для я:

  • "нет совпадающих тестов" при запуске JMH из main в eclipse
  • Я попытался переместить созданный класс вручную в /META-INF/MicroBenchmarks, однако это приводит к следующей ошибке:

    Exception in thread "main" java.lang.IllegalStateException: Mismatched format for the line: JMHSample_01_HelloWorld.class
    at org.openjdk.jmh.runner.BenchmarkRecord.<init>(BenchmarkRecord.java:92)
    at org.openjdk.jmh.runner.MicroBenchmarkList.find(MicroBenchmarkList.java:133)
    at org.openjdk.jmh.runner.Runner.run(Runner.java:150)
    at JMHSample_01_HelloWorld.main(JMHSample_01_HelloWorld.java:80)
    

похоже, что JMH должен производить некоторые допустимые строки в /META - INF/MicroBenchmarks-то есть в этой папке не должно быть сгенерированных файлов классов java, правильно?

может кто-нибудь помочь мне нашли ошибку? Спасибо.

3 ответов


эталонный "исходный код", в дополнение к компиляции, как обычно, должен также обрабатываться обработчиком аннотаций JMH. До JMH 0.5 обработчик аннотаций был частью основного артефакта JMH, поэтому одна зависимость от jmh-core было достаточно. В JMH 0.5 функциональность обработки аннотаций была извлечена в отдельный артефакт для облегчения поддержки других языков.

для того, чтобы получить процессор аннотаций обратно в" старых " Java-проектах JMH, дополнительная зависимость от артефакта процессора должна быть объявлена:

<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-generator-annprocess</artifactId>
    <version>${jmh.version}</version>
    <!-- 
    the processor artifact is required only during compilation and 
    does not need to be transitive, hence provided scope
    -->
    <scope>provided</scope> 
</dependency>

для новых проектов JMH самый простой способ-создать новый проект, используя соответствующий языковой архетип (кроме Java, есть Scala, Groovy и Kotlin архетипы), как описано на Домашняя страница JMH.

mvn archetype:generate \
      -DinteractiveMode=false \
      -DarchetypeGroupId=org.openjdk.jmh \
      -DarchetypeArtifactId=jmh-java-benchmark-archetype \
      -DgroupId=my.benchmark.group \
      -DartifactId=MyBenchMarkArtifact \
      -Dversion=1.0

я получил ту же ошибку в консоли eclipse в моем проекте jmh+maven+eclipse, хотя у меня есть все необходимые зависимости и плагины.

пробовал mvn clean install из терминала вместо встроенного maven в eclipse, получил ниже error

ERROR: org.openjdk.jmh.runner.RunnerException: ERROR: Unable to acquire the JMH lock (/tmp/jmh.lock): already taken by another JMH instance, exiting. Use -Djmh.ignoreLock=true to forcefully continue.
    at org.openjdk.jmh.runner.Runner.run(Runner.java:202)
    at org.openjdk.jmh.Main.main(Main.java:71)

как рекомендовано выше добавил -Djmh.ignoreLock=true как аргументы VM в затмение запуска Java-приложений, он работал


Я получил ту же ошибку, потому что я изменил имя пакета, содержащего мои @Benchmark класс после ее запуска. "Чистый и построить" было достаточно, чтобы заставить его работать снова.