JMeter源码解析之NewDriver.java(一)

JMeter源码解析之NewDriver.java(一)

NewDriver.java主要作用

JMeter程序入口:JMeter的主类-设置初始类路径和加载程序。

文件路径

路径地址:…\apache-jmeter-5.1\src\core\org\apache\jmeter\NewDriver.java

文章重点关于static内容中的代码解析

详细的解释请关注代码中的解释

static {final List<URL> jars = new LinkedList<>();/*** 通过System.getProperty的方法获取系统自带的各种参数,其中有一种参数为"java.class.path",这里获取的是执行JMeter机器的这台PC* */final String initiaClasspath = System.getProperty(JAVA_CLASS_PATH);/*** 从获取的initiaClasspath变量路径中找到JMeter路径,通过文件分隔符“;”进行分隔* */// Find JMeter home dir from the initial classpathString tmpDir;/*** 获得所有Java相关的内容* 例如:C:\Program Files\Java\jdk1.8.0_101\jre\lib\charsets.jar* C:\Program Files\Java\jdk1.8.0_101\jre\lib\deploy.jar* Tokens计算值,猜测是其他操作系统,如Mac OS,因为用window 10,获取的Token值数据是25,远远大于条件中给出的1或者2* 所以我们运行的代码分支是在else后面的内容* */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 {tmpDir = jar.getCanonicalFile().getParentFile().getParent();} catch (IOException e) {tmpDir = null;}} else {// e.g. started from IDE with full classpath/*** 获取JMeter路径,如果获取不到,返回的参数是为空,把null替换成“空值”,如果获取有数据,则说明设置过JMeter路径,如果没有即判断tmpDir.length() == 0* 去获取对应的路径,首先通过System.getProperty("user.dir")的方法获取了程序启动的工程所在文件夹,比如当前工程为:D:\1.JAVA\JmeterDemo,则打印的就是这个路径* 当通过getParent()或者getAbsolutePath(),可以知道获取的路径分别是D:\1.JAVA和D:\1.JAVA\JmeterDemo,然后将值给了tmpDir供下面判断* */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();//获取绝对路径地址tmpDir = userDir.getAbsoluteFile().getAbsolutePath();}}JMETER_INSTALLATION_DIRECTORY=tmpDir;/** Does the system support UNC paths? If so, may need to fix them up* 判断操作系统是否window* later*/boolean usesUNC = OS_NAME_LC.startsWith("windows");// $NON-NLS-1$// Add standard jar locations to initial classpath/*** 加载JMeter对应目录下的JMeter安装目录下的jar包,当前支持三种路径的加载* 第一种:..\lib* 第二种:..\lib\ext* 第三种:..\lib\junit* */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) {//获取所有对应目录下的jar包,首先要判断对应的目录和Jar包是否存在,当对应目录下没有任何JAR包,则抛异常,类似这种异常:java.lang.Throwable: Could not access D:\1.JAVA\JmeterDemo\lib\ext1//	at com.test.demo.GetProperties.main(GetProperties.java:22)File[] libJars = libDir.listFiles((dir, name) -> name.endsWith(".jar"));if (libJars == null) {new Throwable("Could not access " + libDir).printStackTrace(); // NOSONAR No logging herecontinue;}Arrays.sort(libJars); // Bug 50708 Ensure predictable order of jarsfor (File libJar : libJars) {try {String s = libJar.getPath();// Fix path to allow the use of UNC URLsif (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/*** 添加Jar包* new File(s)是通过给定的路径创建一个File对象。* toURI()是File类的方法,将文件路径转换为URI(统一资源标识符)对象。* toURL()是URI类的方法,将URI对象转换为URL(统一资源定位符)对象。* 生成一个jar包路径* */jars.add(new File(s).toURI().toURL());// See Java bug 4496398classpath.append(CLASSPATH_SEPARATOR);classpath.append(s);} catch (MalformedURLException e) { // NOSONAREXCEPTIONS_IN_INIT.add(new Exception("Error adding jar:"+libJar.getAbsolutePath(), e));}}// ClassFinder needs the classpath//将JMeter中获取的Jar进行设置,重新设置环境变量System.setProperty(JAVA_CLASS_PATH, initiaClasspath + classpath.toString());loader = AccessController.doPrivileged((PrivilegedAction<DynamicClassLoader>) () ->new DynamicClassLoader(jars.toArray(new URL[jars.size()])));
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/21629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

扩散世界模型已训练出赶超人类的智能体?

论文标题&#xff1a; Diffusion for World Modeling:Visual Details Matter in Atari 论文作者&#xff1a; Eloi Alonso, Adam Jelley, Vincent Micheli, Anssi Kanervisto, Amos Storkey, Tim Pearce, Franois Fleuret 项目地址&#xff1a; https://github.com/eloial…

【大数据】StarRocks的四种数据模型

通过上一篇博客&#xff08;【大数据】初步认识StarRocks&#xff09;&#xff0c;我们对StarRocks有了一个简单的认识&#xff0c;这边博客呢&#xff0c;我们主要来学习下StarRocks的四种数据模型&#xff1a;明细模型 (Duplicate Key Model)、聚合模型 (Aggregate Key Model…

2024-5-12——吃掉 N 个橘子的最少天数

2024-5-12 题目来源我的题解方法一 深度搜索 超时方法二 动态规划 超内存方法三 灵神题解 题目来源 力扣每日一题&#xff1b;题序&#xff1a;1553 我的题解 方法一 深度搜索 超时 直接使用深度搜索&#xff0c;每次选择一种策略&#xff0c;然后判断最小值 class Solution…

PostgreSQL 修改表结构卡住不动

目录 1 问题2 实现 1 问题 今天遇到的一个问题记录一下&#xff0c;因为系统上的一个改动需要同步脚本至测试库上&#xff0c;具体的脚本内容也很简单,就是修改了某张表的一个字段。但是无论怎么操作都是一直卡住&#xff0c;表的数据量很小就十几条数据所以初步怀疑是表被锁了…

基于EBAZ4205矿板的图像处理:10gamma变换

基于EBAZ4205矿板的图像处理&#xff1a;10gamma变换 项目全部文件 会上传项目全部文件&#xff0c;如果没传&#xff0c;可以私信催我一下&#xff0c;最近太忙了 先看效果 我的项目中的gamma的变换系数为2.2&#xff0c;是会让图像整体变暗的&#xff0c;看右图说明我的ga…

CPVT(ICLR 2023)论文解读

paper&#xff1a;Conditional Positional Encodings for Vision Transformers official implementation&#xff1a;GitHub - Meituan-AutoML/CPVT 存在的问题 位置编码的局限性&#xff1a;传统Transformer中的绝对位置编码&#xff08;无论是可学习的还是固定的&#xff…

YOLO开发教程:从零开始构建自己的目标检测系统

YOLO开发教程&#xff1a;从零开始构建自己的目标检测系统 目录 引言YOLO简介环境搭建 3.1 安装Python与依赖库3.2 安装深度学习框架&#xff08;如PyTorch或TensorFlow&#xff09;3.3 下载YOLO源码 数据准备 4.1 数据集收集与整理4.2 标注工具使用4.3 数据格式转换 模型训练…

【c++进阶(二)】STL之string类的模拟实现

&#x1f493;博主CSDN主页:Am心若依旧&#x1f493; ⏩专栏分类c从入门到精通⏪ &#x1f69a;代码仓库:青酒余成&#x1f69a; &#x1f339;关注我&#x1faf5;带你学习更多c   &#x1f51d;&#x1f51d; 1.前言 本章重点 本章主要介绍一些关键接口的模拟实现&#xff…

Spring MVC 源码分析之 DispatcherServlet#getHandler 方法

前言&#xff1a; 上篇我们分析了 Spring MVC 的工作流程源码&#xff0c;其核心是 DispatcherServlet#doDispatch 方法&#xff0c;这个方法中有获取映射器处理器操作&#xff0c;也就是调用 DispatcherServlet#getHandler 方法&#xff0c;本篇我们重点分析一下 DispatcherS…

0603《哎选》已经稳定运行2年

0603《哎选》已经稳定运行2年 0603《哎选》已经稳定运行2年 介绍 2022年6月3日经过一年的努力&#xff0c;优雅草蜻蜓G系统原生版诞生&#xff0c;本产品应用于《哎选》&#xff0c;经过2年的运营不断的更新迭代&#xff0c;目前产品已经有了一定的用户量&#xff0c;本产品…

MySQL详细安装教程

MySQL详细安装教程 目录&#xff1a; MySQL简介安装步骤 2.1 下载MySQL安装包 2.2 安装MySQL 2.3 配置MySQL 2.4 验证安装示例代码总结MySQL简介 MySQL是一个开源的关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发。它使用结构化查询语言&#xff08;SQL&#xff09…

life diagnostics生物标志物检测试剂盒一SPARCL™ Kits

Life Diagnostics公司专注于研发和生产临床前研究以及动物医学诊断相关的ELISA试剂盒、纯化的生物标志物和抗体等产品。产品覆盖心血管疾病、急性期反应、免疫毒性和免疫学标志物等研究领域&#xff0c;主要应用于小鼠、大鼠、兔、猫、狗、猪、猴和鸡等物种。 新产品——SPARCL…

Spark 3.5.1 升级 Java 17 异常 cannot access class sun.nio.ch.DirectBuffer

异常说明 使用Spark 3.5.1 升级到Java17的时候会有一个异常&#xff0c;异常如下 SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.htm…

go slice切片的详细知识(包含底层扩容)——2

目录 例子 例3&#xff1a;使用append逐个添加元素和一次性添加多个元素的区别 例4&#xff1a;order[low:high:max] 例5&#xff1a;当容量大于1024的时候&#xff0c;每次扩容真的是1.25倍吗&#xff1f; 本文是对上一篇文章的补充&#xff1a; go slice切片的详细知识&…

离轴磁编案例分享 - 机器人关机模组

客户产品 六轴协作机器人产品 关机模组 关机模组内部结构 项目介绍 客户需求: 需要离轴&#xff0c;优点&#xff1a;可以中空走线&#xff0c;方便线缆从机器人中间穿过去&#xff0c;可以更好得保护好线缆&#xff0c;不需要把线漏在外面&#xff0c;影响使用和产品寿命。目…

最适合上班族和宝妈的兼职副业,一天500多,小众副业项目

近年来&#xff0c;地方特色小吃逐渐受到人们的热烈追捧&#xff0c;尤其是在直播的助力下&#xff0c;许多地方的特色小吃得以走进大众视野&#xff0c;吸引了大量流量和人气。因此&#xff0c;有很大一部分商家和创业者看准了这一商机&#xff0c;纷纷投身于地方特色小吃的制…

怎么把多种内容做成二维码?扫码展现多种内容的制作方法

现在很多的场景下都有不同类型的二维码&#xff0c;用来承载内容为用户提供内容展示&#xff0c;比如图片、视频、文字、文件、地图等等内容&#xff0c;都可以组合起来通过扫码的方式在手机上展示。那么如何制作组合内容的二维码相信有很多的小伙伴都非常的感兴趣。 其实二维…

众汇:外汇狙击指标如何使用?

对于投资者来说&#xff0c;我们各位交易的目的是什么?WeTrade众汇认为那就是盈利。所以来说有一个指标对各位投资者来说那是相当有帮助的。这是因为对于交易者而言&#xff0c;利用这些指标可以快速识别盈利的买卖时机。当我们选择一个指标之后&#xff0c;深入了解其适用范围…

【SpringBoot】打包成Docker镜像后日志输出中文乱码

解决方法 配置文件中对日志的配置添加如下选项 logging:charset:file: UTF-8console: UTF-8注:如果只需要解决控制台乱码,则不需要file这一项

「布道师系列文章」众安保险王凯解析 Kafka 网络通信

作者&#xff5c;众安保险基础平台 Java 开发专家王凯 引言 今天给大家带来的是 Kafka 网路通信主要流程的解析&#xff08;基于 Apache Kafka 3.7[2]&#xff09;。同时引申分析了业界当前较火的AutoMQ基于Kafka在网络通信层面的优化和提升。 01 如何构建一个基本的请求…