如何解决JMH + Maven BenchmarkList 输入错误的 JAR
我在一个我认为已经完成的项目中遇到了一个小问题。
它包括三个部分——为整个项目创建的主类(一个带有必要算术的四精度浮点数),一组测试,以及一个使用 JMH
的基准测试工具.因此,pom.xml
应该构建三个 jar 文件——Quadruple-1.0.0.jar
、Quadruple-1.0.0-tests.jar
和 benchmarks.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 举报,一经查实,本站将立刻删除。