JMeter运行Jar包调用内部方法时抛出NoClassDefFoundError错误如何解决
java.lang.NoClassDefFoundError: org/json/simple/JSONObject at CloudBLM_API.ApiAuthentication.<init>(ApiAuthentication.java:23) ~[ModelPublishWebGL.jar:?] at CloudBLM_API.Publisher.<init>(Publisher.java:18) ~[ModelPublishWebGL.jar:?] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_201] at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) ~[?:1.8.0_201] at sun.reflect.DelegatingMethodAccessorImpl.newInstance(Unknown Source) ~[?:1.8.0_201] at java.lang.reflect.Constructor.newInstance(Unknown Source) ~[?:1.8.0_201] at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:83) ~[groovy-all-2.4.16.jar:2.4.16] at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:105) ~[groovy-all-2.4.16.jar:2.4.16] at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:59) ~[groovy-all-2.4.16.jar:2.4.16] at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:238) ~[groovy-all-2.4.16.jar:2.4.16] at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:250) ~[groovy-all-2.4.16.jar:2.4.16] at Script6.run(Script6.groovy:13) ~[?:?] at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:321) ~[groovy-all-2.4.16.jar:2.4.16] at org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:72) ~[groovy-all-2.4.16.jar:2.4.16] at javax.script.CompiledScript.eval(Unknown Source) ~[?:1.8.0_201] at org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:223) ~[ApacheJMeter_core.jar:5.2.1] at org.apache.jmeter.extractor.JSR223PostProcessor.process(JSR223PostProcessor.java:44) ~[ApacheJMeter_components.jar:5.2.1] at org.apache.jmeter.threads.JMeterThread.runPostProcessors(JMeterThread.java:931) ~[ApacheJMeter_core.jar:?] at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:569) ~[ApacheJMeter_core.jar:?] at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:490) ~[ApacheJMeter_core.jar:?] at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:257) ~[ApacheJMeter_core.jar:?] at java.lang.Thread.run(Unknown Source) [?:1.8.0_201] Caused by: java.lang.ClassNotFoundException: org.json.simple.JSONObject at java.net.URLClassLoader.findClass(Unknown Source) ~[?:1.8.0_201] at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_201] at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_201] ... 22 more
问题原因
上述错误是JMeter运行时类路径缺失依赖导致的。你的自定义Jar包ModelPublishWebGL.jar依赖json-simple库处理JSON逻辑,CMD和Jenkins运行正常是因为这两个环境的类路径已经配置了该依赖,而JMeter默认不会自动加载自定义Jar的关联依赖,因此触发类找不到异常。
解决方法
方案1:构建包含全量依赖的Fat Jar
打包自定义Jar时通过构建工具把所有依赖(包括json-simple)一起打进同一个Jar包:- Maven环境使用
maven-shade-plugin插件完成打包 - Gradle环境使用
shadow插件完成打包
打包完成后将Fat Jar放到JMeter安装目录的lib/ext文件夹下,重启JMeter即可生效。
- Maven环境使用
方案2:单独添加缺失的依赖包
下载和开发时版本完全一致的json-simpleJar包,和你的ModelPublishWebGL.jar一起放到JMeter安装目录的lib/ext文件夹下,必须重启JMeter后依赖才会被加载。
注意事项
- 不要在JMeter的
lib、lib/ext目录下存放重复的Jar包,避免引发类加载冲突 - 若使用方案2,务必保证
json-simple的版本和开发自定义Jar时使用的版本一致,避免版本不兼容引发其他运行异常
内容的提问来源于stack exchange,提问作者Mani Maran
相关产品推荐
相关产品推荐

