前往小程序,Get更优阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 >JMeter5.1启动类NewDriver源代码分析

JMeter5.1启动类NewDriver源代码分析

原创
作者头像
天堂小说
发布2021-12-03 16:46:37
4500
发布2021-12-03 16:46:37
举报
文章被收录于专栏: JMeter源码分析 JMeter源码分析

概述

启动JMeter,主要通过NewDriver来实现,直接用于本地 GUI 和非 GUI 调用。

启动类主要做启动时设置项目目录,加载lib目录下的所有依赖包,并反射调用JMeter类的start()方法。

代码位置

image.png
image.png

代码解读

主要变量

代码语言:txt
复制
    private static final String CLASSPATH_SEPARATOR = File.pathSeparator;
    // 获取操作系统
    private static final String OS_NAME = System.getProperty("os.name");
    // 获取语言
    private static final String OS_NAME_LC = OS_NAME.toLowerCase(java.util.Locale.ENGLISH);
    // 获取java classPath
    private static final String JAVA_CLASS_PATH = "java.class.path";
    // 获取jmeter的logfile
    private static final String JMETER_LOGFILE_SYSTEM_PROPERTY = "jmeter.logfile";

    private static final String HEADLESS_MODE_PROPERTY = "java.awt.headless";

    // 动态加载器,主要加载Java依赖包
    private static final DynamicClassLoader loader;

    private static final String JMETER_INSTALLATION_DIRECTORY; // JMeter的安装路径

    private static final List<Exception> EXCEPTIONS_IN_INIT = new ArrayList<>();

静态代码块

主要是加载lib目录下的所有依赖包

代码语言:txt
复制
static {
        final List<URL> jars = new LinkedList<>();
        final String initiaClasspath = System.getProperty(JAVA_CLASS_PATH);

        // Find JMeter home dir from the initial classpath
        String tmpDir;
        // 将获取的classPath进行拆分,分组
        StringTokenizer tok = new StringTokenizer(initiaClasspath, File.pathSeparator);
        if (tok.countTokens() == 1
                || (tok.countTokens()  == 2 // Java on Mac OS can add a second entry to the initial classpath
                    && OS_NAME_LC.startsWith("mac os x")// $NON-NLS-1$
                   )
           ) {
            File jar = new File(tok.nextToken());
            try {
                // JMeter启动类默认找当前文件路径的父目录
                tmpDir = jar.getCanonicalFile().getParentFile().getParent();
            } catch (IOException e) {
                tmpDir = null;
            }
        } else {// e.g. started from IDE with full classpath
        	/*
        	 * JMeter启动类默认找当前文件路径的父目录,由于生成的ApacheJMeter.jar启动包放置到JMeter的bin目录,所以获取的父目录正好是项目当前的目录,
        	 * 但是我们要调用的时候要手动设置jmeter.home这个属性,否则启动会报错
        	 */
            tmpDir = System.getProperty("jmeter.home","");// Allow override $NON-NLS-1$ $NON-NLS-2$
            if (tmpDir.length() == 0) {
                File userDir = new File(System.getProperty("user.dir"));// $NON-NLS-1$
                tmpDir = userDir.getAbsoluteFile().getParent();
            }
        }
        // JMeter项目路径
        JMETER_INSTALLATION_DIRECTORY=tmpDir;

        /*
         * Does the system support UNC paths? If so, may need to fix them up
         * later
         */
        boolean usesUNC = OS_NAME_LC.startsWith("windows");// $NON-NLS-1$

        // Add standard jar locations to initial classpath
        // 获取lib目录下的所有依赖包
        StringBuilder classpath = new StringBuilder();
        File[] libDirs = new File[] { new File(JMETER_INSTALLATION_DIRECTORY + File.separator + "lib"),// $NON-NLS-1$ $NON-NLS-2$
                new File(JMETER_INSTALLATION_DIRECTORY + File.separator + "lib" + File.separator + "ext"),// $NON-NLS-1$ $NON-NLS-2$
                new File(JMETER_INSTALLATION_DIRECTORY + File.separator + "lib" + File.separator + "junit")};// $NON-NLS-1$ $NON-NLS-2$
        for (File libDir : libDirs) {
            File[] libJars = libDir.listFiles((dir, name) -> name.endsWith(".jar"));
            if (libJars == null) {
                new Throwable("Could not access " + libDir).printStackTrace(); // NOSONAR No logging here
                continue;
            }
            Arrays.sort(libJars); // Bug 50708 Ensure predictable order of jars
            for (File libJar : libJars) {
                try {
                    String s = libJar.getPath();

                    // Fix path to allow the use of UNC URLs
                    if (usesUNC) {
                        if (s.startsWith("\\\\") && !s.startsWith("\\\\\\")) {// $NON-NLS-1$ $NON-NLS-2$
                            s = "\\\\" + s;// $NON-NLS-1$
                        } else if (s.startsWith("//") && !s.startsWith("///")) {// $NON-NLS-1$ $NON-NLS-2$
                            s = "//" + s;// $NON-NLS-1$
                        }
                    } // usesUNC

                    jars.add(new File(s).toURI().toURL());// See Java bug 4496398
                    classpath.append(CLASSPATH_SEPARATOR);
                    classpath.append(s);
                } catch (MalformedURLException e) { // NOSONAR
                    EXCEPTIONS_IN_INIT.add(new Exception("Error adding jar:"+libJar.getAbsolutePath(), e));
                }
            }
        }

        // ClassFinder needs the classpath
        System.setProperty(JAVA_CLASS_PATH, initiaClasspath + classpath.toString());

        // 通过加载器将所有jar包加载到类加载器中
        loader = AccessController.doPrivileged(
                (PrivilegedAction<DynamicClassLoader>) () ->
                        new DynamicClassLoader(jars.toArray(new URL[jars.size()]))
        );
    }

主要方法

加载外部依赖包

根据文件URL动态加载到loader

代码语言:txt
复制
    public static void addURL(URL url) {
        loader.addURL(url);
    }

根据包的文件目录,获取当前文件路径及子路径的依赖包,转换为URL,并加载到loader中

代码语言:txt
复制
    public static void addURL(String path) throws MalformedURLException {
        File furl = new File(path);
        loader.addURL(furl.toURI().toURL()); // See Java bug 4496398
        File[] jars = listJars(furl);
        for (File jar : jars) {
            loader.addURL(jar.toURI().toURL()); // See Java bug 4496398
        }
    }

获取JMeter项目路径

代码语言:txt
复制
    public static String getJMeterDir() {
        return JMETER_INSTALLATION_DIRECTORY;
    }

启动JMeter程序

通过Java反射的方法创建JMeter类,执行其start()方法

代码语言:txt
复制
    public static void main(String[] args) {
        if(!EXCEPTIONS_IN_INIT.isEmpty()) {
            System.err.println("Configuration error during init, see exceptions:"+exceptionsToString(EXCEPTIONS_IN_INIT)); // NOSONAR Intentional System.err use
        } else {
            // 设置当前线程的类加载器
            Thread.currentThread().setContextClassLoader(loader);
            
            // 根据输入的外部参数,初始化日志文件
            setLoggingProperties(args);

            try {
                // Only set property if it has not been set explicitely 
                if(System.getProperty(HEADLESS_MODE_PROPERTY) == null && shouldBeHeadless(args)) {
                    System.setProperty(HEADLESS_MODE_PROPERTY, "true");
                }

                // 通过Java反射的方法创建JMeter类,并执行start()方法
                Class<?> initialClass = loader.loadClass("org.apache.jmeter.JMeter");// $NON-NLS-1$
                Object instance = initialClass.getDeclaredConstructor().newInstance();
                Method startup = initialClass.getMethod("start", new Class[] { new String[0].getClass() });// $NON-NLS-1$
                startup.invoke(instance, new Object[] { args });
            } catch(Throwable e){ // NOSONAR We want to log home directory in case of exception
                e.printStackTrace(); // NOSONAR No logger at this step
                System.err.println("JMeter home directory was detected as: "+JMETER_INSTALLATION_DIRECTORY); // NOSONAR Intentional System.err use
            }
        }
    }

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
LV.
文章
0
获赞
0
目录
  • 概述
  • 代码位置
  • 代码解读
    • 主要变量
      • 静态代码块
      • 主要方法
        • 加载外部依赖包
          • 获取JMeter项目路径
            • 启动JMeter程序
            领券
            问题归档 专栏文章 快讯文章归档 关键词归档 开发者手册归档 开发者手册 Section 归档

            两个鬼故事建材建材公司起名取名生煎加盟店赵传奇电视剧全集汽车公司起名给龙凤胎起什么名字好毛巾公司名字起名大全美容美发店起名字好寒武纪大爆发猪宝宝起名喜用字的店铺起名大全评分烤鸭店起名卖家起名好听小餐厅起个什么名字易象宝宝起名软件北京女子图鉴演员表俞起名打分文学 起名字起名的王女孩名字洋气给系统起名宠物品牌起名伍起名字台湾电话郭姓起名字啊店铺免费起名测名字打分免费马蜂窝网磁条读卡器板牙欧盟商标起名网不道德的故事军事网站导航少年生前被连续抽血16次?多部门介入两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”淀粉肠小王子日销售额涨超10倍高中生被打伤下体休学 邯郸通报单亲妈妈陷入热恋 14岁儿子报警何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言张家界的山上“长”满了韩国人?男孩8年未见母亲被告知被遗忘中国拥有亿元资产的家庭达13.3万户19岁小伙救下5人后溺亡 多方发声315晚会后胖东来又人满为患了张立群任西安交通大学校长“重生之我在北大当嫡校长”男子被猫抓伤后确诊“猫抓病”测试车高速逃费 小米:已补缴周杰伦一审败诉网易网友洛杉矶偶遇贾玲今日春分倪萍分享减重40斤方法七年后宇文玥被薅头发捞上岸许家印被限制高消费萧美琴窜访捷克 外交部回应联合利华开始重组专访95后高颜值猪保姆胖东来员工每周单休无小长假男子被流浪猫绊倒 投喂者赔24万小米汽车超级工厂正式揭幕黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发当地回应沈阳致3死车祸车主疑毒驾恒大被罚41.75亿到底怎么缴妈妈回应孩子在校撞护栏坠楼外国人感慨凌晨的中国很安全杨倩无缘巴黎奥运校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变王树国卸任西安交大校长 师生送别手机成瘾是影响睡眠质量重要因素国产伟哥去年销售近13亿阿根廷将发行1万与2万面值的纸币兔狲“狲大娘”因病死亡遭遇山火的松茸之乡“开封王婆”爆火:促成四五十对奥巴马现身唐宁街 黑色着装引猜测考生莫言也上北大硕士复试名单了德国打算提及普京时仅用姓名天水麻辣烫把捣辣椒大爷累坏了

            两个鬼故事 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化