无法在JMeter 3.1中通过Groovy运行可在Eclipse执行的Java读Excel代码
解决JMeter 3.1中Groovy脚本读取Excel的编译错误
嘿,我帮你分析下为啥这段代码在Eclipse能正常跑,放到JMeter的JSR223 Sampler里用Groovy执行就报编译错误了——核心原因是Groovy脚本在JMeter环境下的运行逻辑和Java独立程序不一样,还有几个细节没适配到位,咱们一步步来修复:
问题根源拆解
首先看你遇到的MultipleCompilationErrorsException,主要来自这几个点:
- 不需要main方法:JMeter的JSR223脚本是直接执行代码逻辑的,不是像Java程序那样通过
main方法启动,这个多余的入口方法会直接导致编译失败。 - 路径转义坑:Windows路径里的
\在Groovy字符串中是转义字符,你直接写C:\Users\...会被Groovy解析成无效的转义序列,必须改成\\或者用正斜杠/。 - 缺少类导入:Groovy在JMeter中不会自动导入Apache POI的相关类,你得手动把用到的包都导入进来,不然Groovy找不到这些类。
- 日志输出方式:虽然
System.out.println不是编译错误,但在JMeter里用这个输出的内容会跑到控制台日志里,不如用JMeter自带的log对象更方便调试。
修改后的可运行Groovy脚本
// 先导入所有需要用到的类 import org.apache.poi.xssf.usermodel.XSSFWorkbook import org.apache.poi.xssf.usermodel.XSSFSheet import org.apache.poi.ss.usermodel.Row import org.apache.poi.ss.usermodel.Cell import org.apache.poi.ss.usermodel.DataFormatter import java.io.File import java.io.FileInputStream import java.util.ArrayList import java.util.Locale // 替换成你的Excel路径,注意用双斜杠转义或者正斜杠 def excelFilePath = "C:\\Users\\val1\\Desktop\\Book1.xlsx" def targetColumn = "PhysicalIDs" Integer targetColumnIndex = null // 读取Excel文件 File excelFile = new File(excelFilePath) FileInputStream fis = new FileInputStream(excelFile) XSSFWorkbook workbook = new XSSFWorkbook(fis) XSSFSheet sheet = workbook.getSheetAt(0) // 取第一个工作表 // 遍历第一行,找到目标列的索引 Row headerRow = sheet.getRow(0) for(Cell cell : headerRow) { if (cell.getStringCellValue().equals(targetColumn)) { targetColumnIndex = cell.getColumnIndex() break // 找到就跳出循环,不用继续遍历了 } } // 处理目标列的数据 if (targetColumnIndex != null) { log.info("成功找到目标列,索引为:${targetColumnIndex}") DataFormatter formatter = new DataFormatter(Locale.US) // 统一格式化单元格值 for (Row row : sheet) { Cell cell = row.getCell(targetColumnIndex) if (cell != null) { String cellValue = formatter.formatCellValue(cell) log.info("第${row.rowNum}行的单元格值:${cellValue}") // 如果需要把值存到JMeter变量里,用下面这行 // vars.put("excel_value_${row.rowNum}", cellValue) } else { log.info("第${row.rowNum}行的目标列没有内容") } } } else { log.error("在Excel的第一行里没找到名为${targetColumn}的列!") } // 记得关闭资源,避免内存泄漏 fis.close() workbook.close()
关键修改说明
- 删掉main方法:直接写业务逻辑,JMeter会自动执行脚本里的代码。
- 修复路径转义:把路径里的
\改成\\,或者换成正斜杠C:/Users/val1/Desktop/Book1.xlsx,两种写法都能正常识别。 - 添加类导入:开头的
import语句把所有用到的POI类和Java工具类都导入了,确保Groovy能找到这些类。 - 改用JMeter日志:用
log.info()和log.error()代替System.out.println(),日志会输出到JMeter的jmeter.log文件里,在JMeter的“日志查看器”里就能直接看,比控制台方便多了。 - 关闭资源:最后加上了流和工作簿的关闭操作,避免长时间运行导致资源泄漏。
- 优化循环:找到目标列后加了
break,减少不必要的遍历,提升脚本效率。
额外要注意的点
- POI依赖检查:确保JMeter的
lib目录下有这些POI相关的jar包:poi.jar、poi-ooxml.jar、poi-ooxml-schemas.jar、xmlbeans.jar。JMeter 3.1默认应该带了,但如果缺失的话,你得手动把这些jar包放到lib目录里,然后重启JMeter。 - Groovy版本兼容:JMeter 3.1自带的Groovy版本是2.4.x,尽量别用太新的Groovy语法,比如Java 8+的一些特性,避免兼容性问题。
内容的提问来源于stack exchange,提问作者Vidz
相关产品推荐
相关产品推荐

