如何为JMH基准测试添加项目依赖的外部JAR包?
在JMH中引入外部JAR依赖的正确姿势
嘿,我来帮你解决这个JMH基准测试时引入外部JAR的问题——我之前也踩过-cp参数的坑,咱们一步步捋清楚可行的方案:
推荐方案:用构建工具(Maven/Gradle)管理依赖
这是最省心的方式,构建工具会自动帮你处理类路径和依赖打包,避免手动配置出错。
Maven示例
- 首先在你的
pom.xml中添加JMH核心依赖、插件以及外部JAR依赖:
<dependencies> <!-- JMH核心依赖 --> <dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-core</artifactId> <version>1.37</version> </dependency> <dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-generator-annprocess</artifactId> <version>1.37</version> <scope>provided</scope> </dependency> <!-- 你的外部JAR依赖(本地JAR可使用system scope,或先install到本地仓库) --> <dependency> <groupId>com.example</groupId> <artifactId>your-external-lib</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/your-external-lib.jar</systemPath> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-maven-plugin</artifactId> <version>1.37</version> <executions> <execution> <goals> <goal>compile</goal> <goal>run</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
- 运行
mvn jmh:run,插件会自动把所有依赖(包括你的外部JAR)加入类路径,直接执行基准测试。
Gradle示例
在build.gradle中配置JMH插件和依赖:
plugins { id 'java' id 'me.champeau.jmh' version '0.6.7' } dependencies { jmh 'org.openjdk.jmh:jmh-core:1.37' jmh 'org.openjdk.jmh:jmh-generator-annprocess:1.37' // 你的外部JAR依赖 implementation files('lib/your-external-lib.jar') }
运行./gradlew jmh即可,Gradle会自动处理类路径。
手动命令行方案:正确配置-cp参数
如果你必须手动用命令行执行,之前的类找不到错误大概率是因为类路径没写全——你需要把JMH核心JAR、项目编译后的class文件、所有外部依赖JAR都加入类路径。
正确命令格式(Linux/macOS)
java -cp "jmh-core-1.37.jar:jmh-generator-annprocess-1.37.jar:target/classes/:lib/external-lib1.jar:lib/external-lib2.jar" org.openjdk.jmh.Main YourBenchmarkClass
正确命令格式(Windows)
java -cp "jmh-core-1.37.jar;jmh-generator-annprocess-1.37.jar;target\classes\;lib\external-lib1.jar;lib\external-lib2.jar" org.openjdk.jmh.Main YourBenchmarkClass
关键注意点:
- 路径分隔符:Linux/macOS用
:,Windows用;,不要混用 - 必须包含JMH的两个核心JAR(
jmh-core和jmh-generator-annprocess) - 要加入你的项目编译后的class文件目录(比如
target/classes)或者项目JAR - 所有外部依赖JAR的路径要准确,多个JAR需逐个列出来
备选方案:打包成Fat Jar(可执行JAR)
把JMH、你的项目代码、所有外部依赖打包成一个单独的可执行JAR,这样运行时不用配置复杂的类路径。
用Maven的Shade插件或者Gradle的Shadow插件就能实现,打包后直接运行:
java -jar your-benchmark-fat.jar
常见坑点排查
- 检查JMH版本和Java版本兼容性:JMH 1.37+要求Java 8及以上
- 确保外部JAR没有损坏,类名拼写正确
- 避免类路径中出现重复的类(比如不同版本的同一依赖)
内容的提问来源于stack exchange,提问作者bergtwvd
相关产品推荐
相关产品推荐

