JMH 无法找到资源:/META-INF/BenchmarkList
JMH Unable to find the resource: /META-INF/BenchmarkList
我无法 运行 在 eclipse 中进行简单的 JMH 基准测试。
Maven 依赖项:
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.12</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.12</version>
</dependency>
Java代码:
public class BTest {
@Benchmark
public void test() {
// todo
}
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(BTest.class.getSimpleName())
.build();
new Runner(opt).run();
}
}
运行的结果:
Exception in thread "main" java.lang.RuntimeException: ERROR: Unable
to find the resource: /META-INF/BenchmarkList at
org.openjdk.jmh.runner.AbstractResourceReader.getReaders(AbstractResourceReader.java:96)
at org.openjdk.jmh.runner.BenchmarkList.find(BenchmarkList.java:104)
at org.openjdk.jmh.runner.Runner.internalRun(Runner.java:256) at
org.openjdk.jmh.runner.Runner.run(Runner.java:206) at
com.test.BTest.main(BTest.java:24)
也许问题是,我 运行 从 eclipse 中获取它。
终于找到了。
缺少 exec-maven-plugin
插件
时出现问题
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<id>run-benchmarks</id>
<phase>integration-test</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<classpathScope>test</classpathScope>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<classpath />
<argument>org.openjdk.jmh.Main</argument>
<argument>.*</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
我意识到我的父 pom 中已经有 exec-maven-plugin
,如预期答案中所述,但我必须 运行 mvn clean install
,如 中所述,以修复错误
有过同样的错误; 运行 来自 maven 或 intellij 的测试无效。我意识到问题出在我用 Kotlin 编写了基准测试。将代码更改为 java 解决了问题。
当您的编译器插件未处理与 JMH 相关的注释时,可能会发生这种情况。对我来说, 和 maven-compiler-plugin
的 <annotationProcessorPaths>
更新有效。
pom.xml 必须具有以下对 Java Micro-benchmark Harness (JMH) Framework
的依赖项和配置
<properties>
<jmh.version>1.21</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>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>java-jmh</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<id>run-benchmarks</id>
<phase>integration-test</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<classpathScope>test</classpathScope>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<classpath />
<argument>org.openjdk.jmh.Main</argument>
<argument>.*</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
在此之后转到命令行并 运行 命令 $mvn clean install
同时添加版本。这对我有用
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
如果有人在使用 Gradle,请将 jmh-gradle-plugin 添加到您的插件块:
plugins {
id 'java'
id 'me.champeau.jmh' version '0.6.6'
}
然后在依赖块中添加以下所有内容(检查最新版本的 JMH on Maven here):
dependencies {
jmh 'org.openjdk.jmh:jmh-core:1.34'
jmh 'org.openjdk.jmh:jmh-generator-annprocess:1.34'
// this is the line that solves the missing /META-INF/BenchmarkList error
jmhAnnotationProcessor 'org.openjdk.jmh:jmh-generator-annprocess:1.34'
}
然后只需使用以下内容 运行 通过 Gradle 的基准测试:
./gradlew jmh
运行 通过你的 IDE
如果您还想从 IDE 中 运行 基准而不是通过 Gradle,您可以执行以下任一操作:
选项 1 - main
方法
只需使用一个没有额外配置的主要方法,您的 IDE 将遵循您的注释配置:
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Benchmark)
@Fork(value = 1)
@Warmup(iterations = 5, timeUnit = TimeUnit.MILLISECONDS, time = 5000)
@Measurement(iterations = 5, timeUnit = TimeUnit.MILLISECONDS, time = 5000)
public class MyBenchmark {
public static void main(String[] args) throws RunnerException {
Options options = new OptionsBuilder()
.include(MyBenchmark.class.getSimpleName())
.build();
new Runner(options).run();
}
// benchmarks omitted
}
选项 2 - 安装 JMH 插件
如果您使用的是 IntelliJ,请安装 Preferences > Plugins
部分中的 JMH Java Microharness Benchmark Plugin,然后您可以完全省略 main
方法,IntelliJ 将为您提供 运行 您的 class 姓名旁边的按钮:
我无法 运行 在 eclipse 中进行简单的 JMH 基准测试。 Maven 依赖项:
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.12</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.12</version>
</dependency>
Java代码:
public class BTest {
@Benchmark
public void test() {
// todo
}
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(BTest.class.getSimpleName())
.build();
new Runner(opt).run();
}
}
运行的结果:
Exception in thread "main" java.lang.RuntimeException: ERROR: Unable to find the resource: /META-INF/BenchmarkList at org.openjdk.jmh.runner.AbstractResourceReader.getReaders(AbstractResourceReader.java:96) at org.openjdk.jmh.runner.BenchmarkList.find(BenchmarkList.java:104) at org.openjdk.jmh.runner.Runner.internalRun(Runner.java:256) at org.openjdk.jmh.runner.Runner.run(Runner.java:206) at com.test.BTest.main(BTest.java:24)
也许问题是,我 运行 从 eclipse 中获取它。
终于找到了。
缺少 exec-maven-plugin
插件
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<id>run-benchmarks</id>
<phase>integration-test</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<classpathScope>test</classpathScope>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<classpath />
<argument>org.openjdk.jmh.Main</argument>
<argument>.*</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
我意识到我的父 pom 中已经有 exec-maven-plugin
,如预期答案中所述,但我必须 运行 mvn clean install
,如
有过同样的错误; 运行 来自 maven 或 intellij 的测试无效。我意识到问题出在我用 Kotlin 编写了基准测试。将代码更改为 java 解决了问题。
当您的编译器插件未处理与 JMH 相关的注释时,可能会发生这种情况。对我来说,maven-compiler-plugin
的 <annotationProcessorPaths>
更新有效。
pom.xml 必须具有以下对 Java Micro-benchmark Harness (JMH) Framework
的依赖项和配置<properties>
<jmh.version>1.21</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>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>java-jmh</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<id>run-benchmarks</id>
<phase>integration-test</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<classpathScope>test</classpathScope>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<classpath />
<argument>org.openjdk.jmh.Main</argument>
<argument>.*</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
在此之后转到命令行并 运行 命令 $mvn clean install
同时添加版本。这对我有用
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
如果有人在使用 Gradle,请将 jmh-gradle-plugin 添加到您的插件块:
plugins {
id 'java'
id 'me.champeau.jmh' version '0.6.6'
}
然后在依赖块中添加以下所有内容(检查最新版本的 JMH on Maven here):
dependencies {
jmh 'org.openjdk.jmh:jmh-core:1.34'
jmh 'org.openjdk.jmh:jmh-generator-annprocess:1.34'
// this is the line that solves the missing /META-INF/BenchmarkList error
jmhAnnotationProcessor 'org.openjdk.jmh:jmh-generator-annprocess:1.34'
}
然后只需使用以下内容 运行 通过 Gradle 的基准测试:
./gradlew jmh
运行 通过你的 IDE
如果您还想从 IDE 中 运行 基准而不是通过 Gradle,您可以执行以下任一操作:
选项 1 - main
方法
只需使用一个没有额外配置的主要方法,您的 IDE 将遵循您的注释配置:
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Benchmark)
@Fork(value = 1)
@Warmup(iterations = 5, timeUnit = TimeUnit.MILLISECONDS, time = 5000)
@Measurement(iterations = 5, timeUnit = TimeUnit.MILLISECONDS, time = 5000)
public class MyBenchmark {
public static void main(String[] args) throws RunnerException {
Options options = new OptionsBuilder()
.include(MyBenchmark.class.getSimpleName())
.build();
new Runner(options).run();
}
// benchmarks omitted
}
选项 2 - 安装 JMH 插件
如果您使用的是 IntelliJ,请安装 Preferences > Plugins
部分中的 JMH Java Microharness Benchmark Plugin,然后您可以完全省略 main
方法,IntelliJ 将为您提供 运行 您的 class 姓名旁边的按钮: