gpt4 book ai didi

java - 如何使用 exec :java Instead of exec:exec? 在 Maven 中运行 JMH 基准测试

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:56:18 27 4
gpt4 key购买 nike

post on javapapers.com显示如何运行 JMH通过键入 mvn exec:exec 在 Maven 中进行基准测试。在 Maven 中运行 JMH 非常方便,因为您可以轻松地从 Eclipse 运行配置甚至在 Maven 阶段运行它。

但是,这个设置有两个问题:

  1. 当您终止 Maven 时,JMH 将继续在后台运行,因为 exec:exec 在单独的 VM 中启动它。

  2. 通常,JMH 会启动另一个 VM 来运行基准测试,因此您最终会同时运行至少 3 个 VM。

幸运的是,Exec Maven Plugin带有第二个目标,exec:java,它直接在 VM Maven 运行中执行一个主类。但是,当我尝试配置 Maven 以使用 exec:java 运行 JMH 时,基准测试因缺少类而崩溃:

# JMH 1.11.3 (released 40 days ago)
# VM version: Error: Could not find or load main class org.openjdk.jmh.runner.VersionMain
# VM invoker: C:\Program Files\Java\jdk1.7.0\jre\bin\java.exe
[...]
# Run progress: 0.00% complete, ETA 00:02:40
# Fork: 1 of 1
Error: Could not find or load main class org.openjdk.jmh.runner.ForkedMain
<forked VM failed with exit code 1>

这里是pom.xml的相关部分:

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.4.0</version>
<configuration>
<mainClass>my.Benchmark</mainClass>
</configuration>
</plugin>

下面是我如何从 my.Benchmark 运行 JMH:

public static void main(String[] args) throws RunnerException {
Options options = new OptionsBuilder().include(my.Benchmark.class.getSimpleName())
.forks(1).build();
new Runner(options).run();
}

我意识到 JMH 使用 java.class.path 系统属性来确定分支 VM 的类路径,并且该属性不包含 Maven 的项目依赖项。但是处理这个问题的首选方法是什么?

最佳答案

虽然我之前的回答需要修改基准程序,但这里是一个仅 POM 的解决方案,它将 java.class.path 系统属性设置为 runtime 类路径,其中Dependency Plugin 的帮助:

<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>build-classpath</id>
<goals>
<goal>build-classpath</goal>
</goals>
<configuration>
<includeScope>runtime</includeScope>
<outputProperty>depClasspath</outputProperty>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<configuration>
<mainClass>my.Benchmark</mainClass>
<systemProperties>
<systemProperty>
<key>java.class.path</key>
<value>${project.build.outputDirectory}${path.separator}${depClasspath}</value>
</systemProperty>
</systemProperties>
</configuration>
</plugin>

关于java - 如何使用 exec :java Instead of exec:exec? 在 Maven 中运行 JMH 基准测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35574688/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com