You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Spring依赖构建JMeter采样器遇加载异常求解决方案

解决JMeter引入Spring依赖的Java采样器运行问题

核心问题原因

直接将包含所有依赖的Fat Jar放入lib/ext会引发类冲突:JMeter自身依赖了部分基础库(如commons-logging、某些Spring基础类),与你打包的依赖版本不一致时,会导致类加载异常或类型转换错误。

分步解决方案

  1. 拆分Jar文件

    • 仅将你自己实现JavaSamplerClient的类打包成独立Jar,放入JMeter的lib/ext目录。
    • Spring Boot、测试库等第三方依赖Jar,单独复制到JMeter的lib目录(而非lib/ext)——lib目录负责加载通用第三方依赖,lib/ext仅用于JMeter扩展组件。
  2. 调整Gradle打包配置
    修改build.gradle,只打包自有代码,同时方便提取依赖:

    plugins {
        id 'java'
    }
    
    dependencies {
        // JMeter Java采样器编译依赖,仅编译时使用
        compileOnly 'org.apache.jmeter:ApacheJMeter_java:5.6.3' // 替换为你的JMeter版本
        // Spring及测试库依赖,运行时需要单独提取
        implementation 'org.springframework:spring-core:5.3.24'
        implementation 'org.springframework:spring-context:5.3.24'
        implementation 'com.yourcompany:your-test-lib:1.0.0' // 你的测试库
    }
    
    jar {
        // 仅包含自有类文件
        from sourceSets.main.output
        manifest {
            attributes 'Main-Class': 'com.yourcompany.YourCustomSampler' // 你的采样器全类名
        }
    }
    
    // 可选任务:自动提取所有依赖到指定目录,方便复制到JMeter
    task copyDependencies(type: Copy) {
        from configurations.runtimeClasspath
        into 'build/dependencies'
    }
    
    • 执行gradle jar生成自有类Jar,执行gradle copyDependencies获取所有依赖Jar,分别复制到对应JMeter目录。
  3. 手动初始化Spring上下文
    如果依赖Spring Boot测试库,不要依赖自动配置,手动在采样器中初始化Spring容器:

    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
    import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
    import org.apache.jmeter.samplers.SampleResult;
    
    public class CustomSpringSampler implements JavaSamplerClient {
        private AnnotationConfigApplicationContext springContext;
        private YourTestService testService;
    
        @Override
        public void setupTest(JavaSamplerContext context) {
            // 加载Spring配置类初始化容器
            springContext = new AnnotationConfigApplicationContext(YourSpringConfig.class);
            testService = springContext.getBean(YourTestService.class);
        }
    
        @Override
        public SampleResult runTest(JavaSamplerContext context) {
            SampleResult result = new SampleResult();
            result.sampleStart();
            try {
                // 调用测试库业务方法
                testService.executeTest();
                result.setSuccessful(true);
                result.setResponseData("测试执行完成", "UTF-8");
            } catch (Exception e) {
                result.setSuccessful(false);
                result.setResponseMessage(e.getMessage());
            } finally {
                result.sampleEnd();
            }
            return result;
        }
    
        @Override
        public void teardownTest(JavaSamplerContext context) {
            // 测试结束后关闭Spring容器
            if (springContext != null) {
                springContext.close();
            }
        }
    }
    
  4. 排查类冲突

    • 查看JMeter根目录下的jmeter.log,定位具体异常(如NoClassDefFoundError、ClassCastException)。
    • 用gradle dependencies查看依赖树,排除冲突依赖;或删除JMeterlib目录中与你引入版本不一致的重复Jar。

内容的提问来源于stack exchange,提问作者Raziza O

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:55:14