微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JMH + Maven BenchmarkList 输入错误的 JAR

如何解决JMH + Maven BenchmarkList 输入错误的 JAR

我在一个我认为已经完成的项目中遇到了一个小问题。 它包括三个部分——为整个项目创建的主类(一个带有必要算术的四精度浮点数),一组测试,以及一个使用 JMH 的基准测试工具.因此,pom.xml 应该构建三个 jar 文件——Quadruple-1.0.0.jarQuadruple-1.0.0-tests.jarbenchmarks.jar。确实如此,但问题是它把 BenchmarkList 放在 Quadruple-1.0.0-tests.jar 而不是 benchmarks.jar

此后,尝试执行运行 benchmarks.jar 的基准测试失败并显示消息

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:98)
       at org.openjdk.jmh.runner.BenchmarkList.find(BenchmarkList.java:124)
       at org.openjdk.jmh.runner.Runner.internalRun(Runner.java:253)
       at org.openjdk.jmh.runner.Runner.run(Runner.java:209)
       at org.openjdk.jmh.Main.main(Main.java:71)

以下是 pom.xml 的相关部分:

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <javac.target>1.8</javac.target>
  <jmh.version>1.29</jmh.version>
  <uberjar.name>benchmarks</uberjar.name>
  <junit.jupiter.minorVersion>2.0</junit.jupiter.minorVersion>
</properties>
  ...
<build>
  <plugins>
  
    ....  
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>3.2.1</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <finalName>${uberjar.name}</finalName>
            <transformers>
              <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>org.openjdk.jmh.Main</mainClass>
              </transformer>
              <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
            </transformers>
            <filters>
              <filter>
                <!--
                    Shading signed JARs will fail without this.
                    http://stackoverflow.com/questions/999489/invalid-signature-file-when-attempting-to-run-a-jar
                -->
                <artifact>*:*</artifact>
                <excludes>
                  <exclude>meta-inf/*.SF</exclude>
                  <exclude>meta-inf/*.DSA</exclude>
                  <exclude>meta-inf/*.RSA</exclude>
                </excludes>
              </filter>
            </filters>
          </configuration>
        </execution>
      </executions>
    </plugin>
    
    <plugin>
      <artifactId>maven-jar-plugin</artifactId>
      <executions>
        <execution>
          <id>test-jar</id>
          <phase>package</phase>
          <goals>
            <goal>test-jar</goal>
          </goals>
          
          <configuration>
            <archive>
              <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>libs/</classpathPrefix>
                <mainClass>
                    com.mvohm.quadruple.test.QuadTest
                </mainClass>
              </manifest>
            </archive>
          </configuration>
          
        </execution>
      </executions>
    </plugin>
    
  </plugins>
  ...
</build> 
  

同时在邻居文件夹中我有一个非常相似的项目,它实际上只是基准测试工具的先前版本,并且构建和运行良好。在多次尝试找出导致他们行为如此差异的原因之后,他们的 pom 几乎完全相同。唯一的区别是单独的基准测试项目有一个额外的依赖项(导入 Quadruple),并且项目的名称不同,并且在 test 文件夹中没有 src文件夹基准项目,因此 Quadruple_Benchmarks-0.0.1-SNAPSHOT-tests.jar 除了 MANIFEST.MF 不包含任何内容

BenchmarlList 带到错误jar 的原因可能是什么?通常,谁负责将其放入 benchmarks.jar 而不是任何其他 jar

如果有任何其他信息被证明是相关的并且可以帮助澄清情况,我会立即提供。可以在 github 上访问完整的 pom(处于之前的状态,但具有相同的行为):

https://github.com/m-vokhm/Quadruple/blob/master/pom.xml,(主项目)

https://github.com/m-vokhm/QuadrupleAddendum/blob/master/QuadBenchmarks/pom.xml(旧基准)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。