[Groovy]使用Java執行Groovy腳本程式

  • 100
  • 0

為了能即時修改程式不需要做到編譯,故透過Java來執行Groovy腳本來滿足此需求。

以下範例為將"A123456789,獅哥哥,18"轉換成java的Person物件,其中解析基本資料的程式碼使用Groovy腳本撰寫。

1.Maven加入Groovy類

<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-jsr223</artifactId>
    <version>2.5.6</version>
</dependency>

2.撰寫一隻java工具類可執行Groovy程式

public class GroovyScriptUtil {
    /**
     * 執行Groovy程式
     * @param pData 傳入的資料
     * @param pScript Groovy腳本
     */
    public Person executeScript(String pData, String pScript) throws Exception {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("groovy");
        Person person = null;
        try {
            engine.eval(pScript);
            Invocable invocable = (Invocable) engine;
            // 傳入的參數
            Object[] params = {pData};
            // 執行Groovy(go為欲執行的方法名稱)
            person = (Person) invocable.invokeFunction("go", params);
        } catch (Exception e) {
            throw new Exception(e);
        }
        return person;
    }
}

3.撰寫一個domain物件,當作Groovy的回傳結果

package com.liongogo.domain;

public class Person {
    private String id;
    private String name;
    private int age;
    //以下省略get set方法
}

4.Groovy腳本(此範例視保存於D目錄下的txt檔案中)

import com.liongogo.domain.Person;
/**
    data傳入資料,內容為
    A123456789,獅哥哥,18
*/
def go(data) { 
    println '傳入資料:'+data;
		
    /*拆解資料*/
    String[] d = data.split(',');

    /*根據戶役政資料生成Person物件*/
    Person person = new Person();
    person.setId(d[0]);
    person.setName(d[1]);
    person.setAge(Integer.parseInt(d[2]));

    return person;
};

5.呼叫Util程式並傳入需要的資料

// 載入Groovy腳本
String groovyScript = "";
try {
    File file = new File("D:\\GroovyScript.txt");
    Scanner scanner = new Scanner(file);
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        groovyScript = groovyScript + line;
    }
    scanner.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

// 執行Groovy腳本
try {
    GroovyScriptUtil groovyScriptUtil = new GroovyScriptUtilgroovyScriptUtil();
    Person person = groovyScriptUtil.executeScript("A123456789,獅哥哥,18", groovyScript);
} catch (Exception e) {
    e.printStackTrace();
}