
一個例子引發(fā)的思考
最近在做jenkins pipeline腳本的開發(fā),因此開始使用groovy語言,在對變量的各種調(diào)用過程中,發(fā)現(xiàn)了一個奇怪的問題,代碼如下:
實例1
def str1="hello1"
str2="hello2"
def fun1(){
println(str1)
}
def fun2(){
println(str2)
}
fun2()
fun1()
運行結(jié)果如下:
hello2
Caught: groovy.lang.MissingPropertyException: No such property: str1 for class: Demo4
可以看到fun2() 正常運行;而fun1()則拋出了異常,異常提示是找不到str1,根據(jù)經(jīng)驗我判斷是變量作用域的問題,于是我先詳細的了解了一下關(guān)于groovy中變量的定義!
Groovy中的變量
Groovy中的變量可以通過兩種方式定義 -數(shù)據(jù)類型(包括byte、short、int、long、float、double、char、Boolean和String ),或者使用def關(guān)鍵字。注意:Groovy 中一切皆對象,這意味著 Groovy 中不存在基本類型,我們可以通過println value.class 查看變量類型。定義int x ,寫明了x是一個int 類型,這種的聲明后期不能更改成其他類型;而對于def y,定義后可被修改為其他類型 ,例如下面代碼:
實例2:
def b =1
b="hello"
println b
int a=1
a="hi"
println a
輸出:
hello
Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'hi' with class 'java.lang.String' to class 'int'
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'hi' with class 'java.lang.String' to class 'int'
可以看到println b 正常輸出;而println a 則提示類型錯誤
Goovy中的變量作用域
了解了groovy關(guān)于變量的定義,我們回到實例1,groovy的作用域總結(jié)如下:
Groovy類
Groovy類作用域同Java
Groovy腳本
1.綁定域:腳本內(nèi)的全局作用域,相當于該腳本對象的成員變量。如果沒有定義過變量(可以直接使用或僅僅初始化但未聲明),其作用域即是綁定域。
2.本地域:腳本內(nèi)的代碼塊。如果是定義過的變量,其作用域就是本地域,腳本中聲明的方法訪問不了本地域
所以實例1代碼解釋如下:
def str1="hello1"? //作用域是本地域
str2="hello2" //作用域是綁定域
如果給變量限定類型,則:
String str3="hello3" //作用域是本地域
進一步思考,那么如果我需要把String str3 定義為綁定域該怎么辦呢?
Groovy提供了關(guān)鍵字@Field ,使用他需要引入import groovy.transform.Field
執(zhí)行下面代碼
import groovy.transform.Field
@Field String str3="hello3"
def func1(){
println(
str3)
}
func1()
輸出hello3
變量作用域在jenkins pipline腳本中的應(yīng)用
編寫一個簡單的pipline腳本,如下圖:

運行該腳本會發(fā)現(xiàn)如下問題:

我們可以看到my log2 正常輸出;而輸出變量log1則報錯,原因就是我們文章中講解的變量作用域問題!