如何仅使用evaluate方法在Groovy主脚本中引入其他脚本的类并实例化
解决方案
方案1:直接实例化evaluate加载的类
Groovy中使用evaluate执行外部脚本后,脚本内定义的类会自动被当前脚本的上下文识别,不需要额外导入操作,直接实例化即可使用:
File csvFile = new File("./Csvreader.groovy"); evaluate(csvFile); // 直接实例化加载完成的CSVReader类 def csvReader = new CSVReader() // 按需调用类方法 csvReader.setSeperator(",") csvReader.readCsv() // 测试类方法调用示例 println csvReader.getHeaders() println csvReader.getSize() println csvReader.getLine("user_id", "1001")
方案2:移出类封装,调用evaluate时传递参数
如果不需要保留类结构,可以将逻辑直接写在被调用的Groovy脚本中,通过Binding传递参数,同时支持自定义输入、接收返回结果:
修改后的Csvreader.groovy代码
// 接收主脚本传递的参数 def separatorChar = params.separator ?: ";" def csvFile = new File(params.csvPath ?: "./test.csv") def values = [] def headers = [] void readCsv(){ csvFile.eachLine{ line, number -> if(number == 1){ headers = line.split(separatorChar) as List } else{ def value = line.split(separatorChar) def map =[:] value.eachWithIndex{ entry, idx -> map.put(headers[idx], entry) } values.add(map) } } } def getValues(){ return values } def getHeaders(){ return headers } def getSize(){ return values.size() } def getLine(def keyParam, def value){ return values.find{ it[keyParam] == value } } // 执行逻辑后返回结果给主脚本 readCsv() return [ headers: headers, values: values, getSize: this.&getSize, getLine: this.&getLine ]
主脚本调用代码
// 构造参数绑定对象 def binding = new Binding() // 传入自定义参数 binding.setVariable("params", [ csvPath: "./business.csv", separator: "," ]) // 执行脚本并接收返回结果 def csvResult = evaluate(new File("./Csvreader.groovy"), binding) // 使用返回结果 println csvResult.headers println csvResult.getSize() println csvResult.getLine("order_id", "2024001")
内容的提问来源于stack exchange,提问作者user15980267
相关产品推荐
相关产品推荐

