JMH не работает в Eclipse (как проект Maven) - нет тестов для запуска
Я хочу начать взглянуть на JMH, и я не могу запустить тесты по некоторым причинам. Позвольте мне объяснить, что я пытался:
- настройка проекта maven в Eclipse
определить pom.XML, например:
скачал некоторые официальные примеры JMH. В качестве примера я выбрал, что довольно просто и хорошее место для начать: http://hg.openjdk.java.net/code-tools/jmh/file/0c58dc4fcf17/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_01_HelloWorld.java
- щелкните правой кнопкой мыши > выполнить как > 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
класс после ее запуска. "Чистый и построить" было достаточно, чтобы заставить его работать снова.