繁体   English   中英

JMH 在 Eclipse 中不工作(作为 Maven 项目)-没有要运行的基准测试

[英]JMH not working in Eclipse (as Maven project) - No benchmarks to run

我想开始看看 JMH,但由于某些原因我无法运行基准测试。 让我解释一下我的尝试:

  1. 在 Eclipse 中设置一个 Maven 项目
  2. 像这样定义 pom.xml:在此处输入图片说明

  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 应用程序

但是,这会产生输出:

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)

我用谷歌搜索过,上面的例子似乎应该有效,但对我来说不是这样。 我也试图通过阅读来解决这个问题,但这似乎对我不起作用:

  • 在 Eclipse 中从 main 运行 JMH 时“没有匹配的基准”
  • 我尝试将生成的类手动移动到 /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 类文件,对吗?

谁能帮我找出错误? 谢谢你。

除了像往常一样编译之外,基准“源代码”还需要由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

虽然拥有所有必需的依赖项和插件,但我在jmh + maven + eclipse项目中的eclipse控制台中遇到了同样的错误。

在eclipse中尝试从终端而不是嵌入式maven进行mvn clean install ,得到以下错误

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)

如上所述在eclipse Java应用程序启动器中添加-Djmh.ignoreLock=true作为VM参数, 它工作正常

我得到了同样的错误,因为我之前运行它后更改了包含我的@Benchmark类的包的名称。 “清洁和构建”足以使其再次运行。

如果您重构了包含@Benchmark 的类的名称,您可能会遇到此错误,

您还必须更改主函数中的名称。

OptionsBuilder opts = new OptionsBuilder();
opts.include("<new_class_name>");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM