java 无法找到该资源:/META-INF/准则列表

dw1jzc5e  于 2023-01-24  发布在  Java
关注(0)|答案(7)|浏览(147)

我无法在eclipse中运行简单的JMH基准测试。

<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();
    }
}

运行结果:

线程“main”中出现异常java.lang。错误:找不到资源:/META-INF/基准测试列表,网址为org.openjdk.jmh.runner;抽象资源阅读器.getReaders(抽象资源阅读器. java:96),网址为org.openjdk.jmh.runner;基准测试列表.find(基准测试列表. java:104),网址为org.openjdk.jmh.runner.Runner.internalRun(运行者. java:256),网址为org.openjdk.jmh.runner.Runner.run(运行者. java:206),网址为com.test.BTest.main(btest. java:24)
可能问题是,我在日 eclipse 上运行。

gupuwyp2

gupuwyp21#

终于找到了,有个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>
ef1yzkbh

ef1yzkbh2#

如果有人正在使用Gradle,请将jmh-gradle-plugin添加到您的插件块:

plugins {
    id 'java'
    id 'me.champeau.jmh' version '0.6.8'
}

然后在依赖项块中添加以下所有内容(检查JMH on Maven here的最新版本):

dependencies {
    jmh 'org.openjdk.jmh:jmh-core:1.36'
    jmh 'org.openjdk.jmh:jmh-generator-annprocess:1.36'

    // this is the line that solves the missing /META-INF/BenchmarkList error
    jmhAnnotationProcessor 'org.openjdk.jmh:jmh-generator-annprocess:1.36'
}

然后,只需使用以下方法通过Gradle运行基准测试:

./gradlew jmh

在IDE中运行

如果您还想从IDE内部而不是通过Gradle运行基准测试,可以执行以下任一操作:

选项1 -main方法

只需使用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会在你的类名旁边给予你一个运行按钮:

qq24tv8q

qq24tv8q3#

pom.xml必须具有以下对Java微基准测试工具(JMH)框架的依赖关系和配置

<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

puruo6ea

puruo6ea4#

当您的编译器插件没有处理JMH相关的注解时,可能会发生这种情况。对我来说,带有maven-compiler-plugin<annotationProcessorPaths>更新的Gill's answer工作正常。

niknxzdl

niknxzdl5#

我意识到我的父pom中已经有了exec-maven-plugin,如预期答案中所述,但我必须运行mvn clean install(如https://stackoverflow.com/a/40748670中所述)来修复错误

jgwigjjp

jgwigjjp6#

犯了同样的错误;从maven或intellij运行测试也不起作用。我意识到问题是我用Kotlin编写了基准测试。将代码改为java解决了这个问题。

vvppvyoh

vvppvyoh7#

也添加版本。这对我很有效

<groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>3.0.0</version>

相关问题