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

JMeter Java代码执行无SSL证书URL时出现NoSuchMethodError异常

负载测试代码调用无SSL证书URL时的异常问题

我编写了用于负载性能测试的Java代码,使用Google URL测试时可正常执行,但输入无SSL证书的自有URL时,代码执行失败并抛出如下异常:

测试代码

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.config.gui.ArgumentsPanel;
import org.apache.jmeter.control.LoopController;
import org.apache.jmeter.control.gui.LoopControlPanel;
import org.apache.jmeter.control.gui.TestPlanGui;
import org.apache.jmeter.engine.StandardJMeterEngine;
import org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui;
import org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy;
import org.apache.jmeter.reporters.ResultCollector;
import org.apache.jmeter.reporters.Summariser;
import org.apache.jmeter.save.SaveService;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.TestPlan;
import org.apache.jmeter.threads.ThreadGroup;
import org.apache.jmeter.threads.gui.ThreadGroupGui;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.collections.HashTree;

public class LoadPerformance {
    
    static Scanner s = new Scanner(System.in);            

    public static void main(String[] arg) throws Exception {
        
        // 提示用户输入URL
        System.out.print("Enter URL: ");
        String url = System.console().readLine();
        System.out.println("Enter the No.of USER: ");
        int user = s.nextInt();
        System.out.println("Enter the No.of LOOP: ");
        int loop = s.nextInt();
        System.out.println("Enter the ramp up: ");
        int rampup = s.nextInt();

        String jmeter = "~/Downloads/Apache_Jars/apache-jmeter-5.5";
        File jmeterHome=new File(jmeter);
        String slash = System.getProperty("file.separator");

        if (jmeterHome.exists()) {
            File jmeterProperties = new File(jmeterHome.getPath() + slash + "bin" + slash + "jmeter.properties");
            if (jmeterProperties.exists()) {
                // JMeter引擎
                StandardJMeterEngine jmeter1 = new StandardJMeterEngine();

                // JMeter初始化(配置、日志、本地化等)
                JMeterUtils.setJMeterHome(jmeterHome.getPath());
                JMeterUtils.loadJMeterProperties(jmeterProperties.getPath());
                JMeterUtils.initLogging();// 可注释此查看DEBUG级日志
                JMeterUtils.initLocale();

                // JMeter测试计划(基于JOrphan HashTree)
                HashTree testPlanTree = new HashTree();

                // HTTP采样器
                HTTPSamplerProxy client = new HTTPSamplerProxy();
                client.setDomain(url);          
                client.setPath("/");
                client.setMethod("GET");
                client.setName("Open Client");
                client.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName());
                client.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName());

                // 循环控制器
                LoopController loopController = new LoopController();
                loopController.setLoops(loop);
                loopController.setFirst(true);
                loopController.setProperty(TestElement.TEST_CLASS, LoopController.class.getName());
                loopController.setProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName());
                loopController.initialize();

                // 线程组
                ThreadGroup threadGroup = new ThreadGroup();
                threadGroup.setName("Example Thread Group");
                threadGroup.setNumThreads(user);
                threadGroup.setRampUp(rampup);
                threadGroup.setSamplerController(loopController);
                threadGroup.setProperty(TestElement.TEST_CLASS, ThreadGroup.class.getName());
                threadGroup.setProperty(TestElement.GUI_CLASS, ThreadGroupGui.class.getName());

                // 测试计划
                TestPlan testPlan = new TestPlan("Create JMeter Script From Java Code");
                testPlan.setProperty(TestElement.TEST_CLASS, TestPlan.class.getName());
                testPlan.setProperty(TestElement.GUI_CLASS, TestPlanGui.class.getName());
                testPlan.setUserDefinedVariables((Arguments) new ArgumentsPanel().createTestElement());

                // 组装测试计划
                testPlanTree.add(testPlan);
                HashTree threadGroupHashTree = testPlanTree.add(testPlan, threadGroup);
                threadGroupHashTree.add(client);

                // 保存测试计划为jmx文件
                SaveService.saveTree(testPlanTree, Files.newOutputStream(Paths.get(jmeterHome + slash + "example.jmx")));

                Summariser summer = null;
                String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary");
                if (summariserName.length() > 0) {
                    summer = new Summariser(summariserName);
                }

                // 保存测试结果到jtl文件
                String logFile = jmeterHome + slash + "example.jtl";
                ResultCollector logger = new ResultCollector(summer);
                logger.setFilename(logFile);
                testPlanTree.add(testPlanTree.getArray()[0], logger);

                // 运行测试计划
                jmeter1.configure(testPlanTree);
                jmeter1.run();

                System.out.println("Test completed. See " + jmeterHome + slash + "example.jtl file for results");
                System.out.println("JMeter .jmx script is available at " + jmeterHome + slash + "example.jmx");
                System.exit(0);
            }
        }
        System.err.println("jmeter.home property is not set or pointing to incorrect location");
        System.exit(1);
    }
}

抛出的异常

Exception in thread "Example Thread Group 1-1"
java.lang.NoSuchMethodError:
org.apache.jmeter.util.HttpSSLProtocolSocketFactory.(Lorg/apache/jmeter/util/JsseSSLManager;I)V
at
org.apache.jmeter.protocol.http.util.HC4TrustAllSSLSocketFactory.(HC4TrustAllSSLSocketFactory.java:55)
at
org.apache.jmeter.protocol.http.sampler.LazySchemeSocketFactory$AdapteeHolder.checkAndInit(LazySchemeSocketFactory.java:52)
at
org.apache.jmeter.protocol.http.sampler.LazySchemeSocketFactory$AdapteeHolder.(LazySchemeSocketFactory.java:44)
at
org.apache.jmeter.protocol.http.sampler.LazySchemeSocketFactory.createSocket(LazySchemeSocketFactory.java:79)
at
org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:168)
at
org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:326)
at
org.apache.jmeter.protocol.http.sampler.MeasuringConnectionManager$MeasuredConnection.open(MeasuringConnectionManager.java:114)
at
org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:610)
at
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:445)
at
org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:835)
at
org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at
org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
at
org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.executeRequest(HTTPHC4Impl.java:654)
at
org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:413)
at
org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:76)
at
org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1166)
at
org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1155)
at
org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:651)
at
org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:570)
at
org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:501)
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:268)
at java.lang.Thread.run(Thread.java:748)

问题原因分析

这个NoSuchMethodError本质是JMeter HTTPS相关组件的版本不兼容或依赖缺失:

  • 访问无SSL证书的URL时,JMeter会触发信任所有证书的逻辑,尝试初始化HC4TrustAllSSLSocketFactory,但该类依赖的HttpSSLProtocolSocketFactory构造方法不存在
  • 大概率是项目依赖的JMeter jar包版本与本地安装的JMeter 5.5版本不一致,或者缺少ApacheJMeter_http核心组件
  • 也可能存在第三方HTTP客户端库(如httpclient、httpcore)的版本冲突,覆盖了JMeter自带的兼容版本

解决方案

1. 统一JMeter依赖版本

确保项目中所有JMeter相关依赖版本与本地安装的JMeter 5.5完全一致,以Maven为例:

<dependencies>
    <dependency>
        <groupId>org.apache.jmeter</groupId>
        <artifactId>ApacheJMeter_core</artifactId>
        <version>5.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.jmeter</groupId>
        <artifactId>ApacheJMeter_http</artifactId>
        <version>5.5</version>
    </dependency>
</dependencies>

2. 显式配置忽略SSL证书验证

在JMeter初始化代码后添加以下配置,绕过证书验证逻辑,避免触发不兼容的Socket工厂:

// 忽略SSL证书及主机名验证
JMeterUtils.setProperty("https.socket.protocols", "TLSv1.2");
JMeterUtils.setProperty("javax.net.ssl.trustStore", "dummy");
JMeterUtils.setProperty("javax.net.ssl.trustStorePassword", "dummy");
JMeterUtils.setProperty("https.host.verifier", "org.apache.jmeter.protocol.http.control.NoopHostnameVerifier");

同时给HTTPSamplerProxy指定HTTPS协议:

client.setProtocol("https");

3. 清理依赖冲突

检查项目依赖树,排除与JMeter 5.5不兼容的httpclient/httpcore版本,确保使用JMeter自带的版本(JMeter 5.5对应httpclient 4.5.13、httpcore 4.4.14)。

内容的提问来源于stack exchange,提问作者Subramanian I

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:45:01