【问题标题】:Groovy include new Groovy scriptGroovy 包含新的 Groovy 脚本
【发布时间】:2021-05-20 10:11:54
【问题描述】:

我对 Groovy 很陌生,我想从主 groovy 脚本中的另一个 groovy 脚本导入一个类。我已经看到了这个post。但是由于环境限制,我不能使用 GroovyClassLoader 之类的函数,也不能导入任何库/框架。我唯一的可能是使用评估方法。

我试过了:

主脚本(评估不会抛出任何错误)

File csvFile = new File("./Csvreader.groovy");
evaluate(csvFile);

Csvreader 脚本

class CSVReader{
    def csvFile = new File('./test.csv');
    def separatorChar = ";"
    def values = [];
    def headers = [];

    void setSeperator(String s){
        if(s != ""){
            separatorChar = s;
        }
    }

    void readCsv(){
        csvFile.eachLine{ line, number ->
            if(number == 1){
                def head = line.split(separatorChar);
                for (entry in head) {
                    headers.add(entry);
                }
            } else{
                def value = line.split(separatorChar);
                def map =[:];
                def i = 0;
                for (entry in value) {
                    map.put(headers[i], entry);
                    i++;
                }
                values.add(map);
            }
        }

    }

    def getValues(){
        return values;
    }

    def getHeaders(){
        return headers;
    }

    def getSize(){
        return values.size();
    }

    def getLine(def keyParam, def value){
        for(int i = 0; i < values.size(); i++){
            def line = values[i];
            if(values[i][keyParam] == value){
                return values[i];
            }
        }
        
    }

}

但是,我需要在评估调用中传递参数(并且我会将方法移到类之外),或者我需要创建类的实例。 不幸的是,我真的不知道我该怎么做,有人有解决方案吗?

【问题讨论】:

  • 为什么不能使用类加载器?你在詹金斯管道中吗?
  • 不完全是,但我使用的产品受到限制,并非所有 Groovy 方法都被允许
  • 好的。 groovy 中没有evaluate 这样的方法。好像是你的产品提供的,你得看一下这个产品的说明书……
  • 你确定吗?原因在链接的post 中,最佳答案是评估
  • 好的。我明白了 - 你的意思是 Script.evaluate 方法 docs.groovy-lang.org/latest/html/api/groovy/lang/…

标签: groovy


【解决方案1】:

您可以尝试在 Csvreader.groovy 文件的末尾添加表达式 return CSVReader.class,它将返回一个已编译的类。

然后在您的调用者脚本中,您可以创建此类的一个实例并将其用作任何其他类实例。

Csvreader.groovy

class CSVReader{
    def separatorChar = ";"
    
    void setSeparator(String s){
        if(s != ""){
            separatorChar = s;
        }
    }
}

return CSVReader.class

调用者脚本

File csvFile = new File("./Csvreader.groovy")
def CSVReaderClass = evaluate(csvFile)
def cvsReader = CSVReaderClass.newInstance()

cvsReader.setSeparator("Z")
println cvsReader.separatorChar

【讨论】:

  • 谢谢,这正是我所需要的
猜你喜欢
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 2012-07-10
  • 2010-12-19
  • 2018-04-12
相关资源
最近更新 更多