JMeter自定义Java采样器使用jackson-databind时出现NoClassDefFoundError
我之前做JMeter自定义采样器时也踩过一模一样的坑,给你几个亲测有效的解决思路,一步步来排查:
先确认jar包版本兼容性
JMeter本身自带了Jackson的核心组件(比如jackson-core、jackson-annotations),如果你的jackson-databind版本和JMeter自带版本不一致,很容易出现类加载冲突或找不到类的情况。比如JMeter 5.5自带的是Jackson 2.13.2.2版本,你最好下载对应版本的jackson-databind、jackson-core、jackson-annotations三个jar包——这三个是databind的必备依赖,缺一不可。正确放置jar包的位置
- 你的自定义采样器jar包应该放在
/lib/ext目录下,这是JMeter加载自定义组件的标准位置; - 而jackson系列的依赖jar包,必须放在
/lib目录下,绝对不能放/lib/ext——/lib/ext是给JMeter插件/自定义组件用的,依赖库放在/lib才会被JMeter的系统类加载器正确加载。
- 你的自定义采样器jar包应该放在
重启JMeter是关键
JMeter只有在启动时才会扫描/lib和/lib/ext目录下的jar包,中途添加的jar不会被自动加载。所以放好jar包后,一定要完全关闭JMeter再重新启动,别直接点界面上的重启按钮,有时候会有缓存残留。别折腾系统CLASSPATH变量
JMeter启动时会忽略系统的CLASSPATH环境变量,它有自己独立的类加载机制,所以你添加路径到CLASSPATH的操作其实没用,反而可能引入其他冲突,建议直接清空相关的CLASSPATH配置。验证依赖是否加载成功
你可以用JSR223采样器写一段简单代码测试Jackson类是否能被加载:try { Class.forName("com.fasterxml.jackson.databind.ObjectMapper"); log.info("Jackson ObjectMapper加载成功!"); } catch (ClassNotFoundException e) { log.error("加载Jackson ObjectMapper失败", e); }运行这个采样器后,打开JMeter的日志面板(右上角黄色感叹号图标)查看输出——如果显示加载成功,那就是你自定义采样器的代码问题;如果还是报错,那就是jar包的位置或版本不对。
打包自定义采样器的注意事项
如果你自己打包自定义采样器的jar,千万别把Jackson的依赖打包进去(也就是不要打fat jar)。因为JMeter已经会加载/lib下的依赖,打包进去会导致重复加载,反而引发类冲突。
内容的提问来源于stack exchange,提问作者GregT

