调试JMeter5源码

JMeter源码的开发调试

说明

本文编译这部分内容基本来源于网上。debug相关内容为本人根据实际情况整理。

JMeter5.2开始,使用gradle代替了原来ant,所以基于源码的本地环境搭建略有不同。JMeter 5.4.1使用的gradle文件不是build.gradle文件,而是build.gradle.kts。

所需环境

  • JDK 8 +
  • JMeter 源码(本例使用的是5.4.1版本)
  • IntelliJ IDEA / Eclipse:本例使用IntelliJ IDEA CE 2020.3来构建本地开发环境(IDEA版本需要>=2018.3.1)

编译

下面是在IDEA打开JMeter工程的步骤说明。

  1. 启动idea,点击File -> open,选中jmeter源码目录下build.gradle.kts

  2. 选择“Open as Project”

  3. 确保“Create separate module per source set” 和 “Use default gradle wrapper”选中,然后点击ok。(这两项不一定会有,可能和IDEA版本有关)

随后idea会自动开始下载JMeter所需依赖,等待执行完成。

注意 这里不要对Gradle设置阿里云镜像,否则会出现依赖加载不成功,在checksum时,会有部分依赖报错,开始前建议暂时取消Gradle的镜像。

为了不使用ali的gradle仓库,我把~/.gradle下的init.gradle(使用了ali的gradle库)重命名为init.gradle.bak了,这样gradle在运行的时候不再使用ali的库。

依赖下载完成后,所需的依赖是在gradle的cache目录下,我们需要执行命令打包构建,将所需的依赖复制一份到jmeter源码目录的lib目录下。在Terminal中执行(gradle需要先配置环境变量)gradlew runGui。或在gradle任务下的developement下执行runGUI,以便在工程根目录下的lib下生成相关jar。

执行完成后,会打开构建好的jmeter GUI界面。查看lib目录,jar包也已复制完成。在调试之前,先关闭打开的JMeter界面。

在IDEA中debug源码

下面是debug设置的操作说明:

  1. 在IDEA中,快捷键cmd+shift+f或double shift(mac电脑),搜索找到NewDriver类。

  2. 点击小锤子旁边的 Add Configuration…

  3. 增加Application设置,在VM options中加入 -Djmeter.home=xxx(JMeter源码目录),点击ok。

对于jmeter 5.4.1 ,为了debug jmeter,我是这样设置的:

  1. 修改run configuration如下:
1
2
3
4
5
6
7
8
vm option:
-Djmeter.home=/Users/lizhiqiang/Test/src/jmeter -cp .;/Users/lizhiqiang/Test/src/jmeter

classname:
org.apache.jmeter.NewDriver

environment variables:
JMETER_HOME=/Users/lizhiqiang/Test/src/jmeter
  1. 生成lib下相关jar(如果之前已经执行过runGUI,不需要再执行

  2. 修改代码

因为代码逻辑设定,所以为了启动debug,需要修改少量代码。如果不修改代码,debug的时候会报错。因此在line 87行添加一行:tmpDir = null; //lizhiqiang debug。(可能是我的野路子)。记得这行代码在正式发布的时候去除或注释掉!

修改后这段代码是这样的:

1
2
3
4
tmpDir = null; //lizhiqiang debug
if (tmpDir == null) {
tmpDir = System.getenv("JMETER_HOME");
}

这样,程序将使用环境变量JMETER_HOME定义的目录.

  1. 点击debug按钮,运行代码,随后会启动JMeter的GUI了,接下来我们就可以在想了解功能上,打断点或者修改源码,调试JMeter。

debug时相关错误

尝试使用过下面的命令,但可能都不是正确的方式,因为后面尝试了都不能将jmeter启动起来,最终还是按照之前提过的方法,不实用ali的仓库进行构建。

1
2
3
4
5
6
#检查校验和:构建完成后才检查校验和
./gradlew clean build -Djava.awt.headless=true -PchecksumFailOn=build_finish
-PchecksumFailOn=build_finish

#不检查校验和,也不测试
./gradlew clean build -Djava.awt.headless=true -PchecksumIgnore -x test

下面是默认执行gradle build时出现的错误。这些校验和相关的错误要解决,否则可能后面还是不能运行成功。解决的方法在前面提过,就是不要使用ali的仓库(至少在我的实践看来是这样的。原因可能还是因为某些依赖的包不再ali的仓库里):

1
2
3
4
错误信息:
Checksum/PGP violations detected on resolving configuration :src:testkit-wiremock:compileClasspath
No PGP signature (.asc file) found for artifact:

下面的错误不记得是如何消除的了,但比较确定的一点是,没有checksum相关的错误后,下面的错误也没了:

  • jmeter Caused by: java.io.FileNotFoundException: subprojects/configuration-cache/src/main/kotlin (Is a directory)
  • 其他一些错误:
1
2
3
4
5
Create separate module per source set
Task :src:components:autostyleJavaCheck FAILED
src:bshclient:autostyleJavaCheck FAILED
Task :src:testkit-wiremock:compileJava FAILED
java/org/apache/jorphan/gui/DynamicStyle.java使用了未经检查或不安全的操作

参考

构建文档:

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021 Johnny Li
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信