運(yùn)行Groovy代碼
運(yùn)行Groovy代碼砾跃,有兩種方法:
-
直接使用
groovy filename
命令,它會在內(nèi)存中直接編譯代碼運(yùn)行,而不會生成什么編譯文件。
假設(shè)在桌面上有一個名為hello.groovy
文件:/*======hello.groovy==========*/ def prompt="Press your name:" def console=System.console() def name=new String(console.readLine(prompt,null)) for (;name=="";name=new String(console.readLine(prompt,null))){ println "input can't be empty"; } println "hello! Mr.$name"
則在命令行中(切換到所在目錄):
C:\Users\Berlin\Desktop>groovy hello Press your name: input can't be empty Press your name:Andrew hello! Mr.Andrew C:\Users\Berlin\Desktop>
-
使用
groovyc
命令(類似javac
命令)將其顯式的編譯為.class
文件,然后使用java
命令運(yùn)行纷责。
這里有幾點(diǎn)需要注意:- 因?yàn)闆]有包聲明捍掺,則使用
groovyc
命令時可以用-d
來指定.class
文件的輸出路徑。 - 使用
java
命令運(yùn)行時再膳,要將%GROOVY_HOME%\embeddable\groovy-all-2.4.12.jar
這個包加入-classpath
類搜索路徑中去挺勿,其中%GROOVY_HOME%
是安裝Groovy時的環(huán)境變量,在我的機(jī)器上是C:\Program Files\Groovy\groovy-2.4.12
喂柒。 - 有一個點(diǎn)請注意不瓶,上面命令不能直接寫為
java -classpath %GROOVY_HOME%\embeddable......
禾嫉,這是因?yàn)檎归_后就變成了java -classpath C:\Program Files\Groovy\groovy-2.4.12\embeddable......
,因?yàn)槠渲邪ㄒ粋€空格(C:\Program Files
)從而會將C:\Program
認(rèn)為是一個路徑蚊丐,解決辦法是使用雙引號括起來:java -classpath "%GROOVY_HOME%\embeddable......" .....
-
java -classpath
后面如果依賴多個路徑熙参,將路徑用分號分隔 -
java
命令最后跟要運(yùn)行的class
文件,但是有時會出現(xiàn)“無法加載類或找不到主類”的錯誤提示麦备,一個解決辦法是孽椰,將class
文件所在路徑加入到-classpath
的路徑中去。
作為例子凛篙,展示一個使用拓展模塊定制自己的拓展方法黍匾。
在Groovy中可以給一個類添加拓展方法,既可以是實(shí)例方法(其中有this指針)也可以是靜態(tài)方法呛梆。這分為兩步:- 首先锐涯,將所有方法放入一個包裝類中,但是必須都聲明為(該包裝類的)靜態(tài)方法填物。而這個方法(對于被拓展類)到底是實(shí)例方法還是靜態(tài)方法要在清單文件中設(shè)置纹腌。這些方法,第一個參數(shù)是被拓展類類型融痛,爾后的參數(shù)都是要傳入這個方法的參數(shù)壶笼。事實(shí)上,可以想象其中的調(diào)用原理雁刷,例如在
StringExtension
包裝類中拓展一個String方法覆劈,作用是將字符串全部轉(zhuǎn)為大/小寫并打印:def static unifyFormatAndPrint(String str,boolean isUppercase)
沛励,調(diào)用時"hello Bob".unifyFormatAndPrint(true)
责语,內(nèi)部實(shí)際上是StringExtension.unifyFormatAndPrint("hello Bob",true)
。當(dāng)然如果是一個(對被拓展類而言的)靜態(tài)方法目派,則第一個參數(shù)就沒有用了(當(dāng)然必須得有)坤候。
這個文件如下所示://MyStringExtension.groovy class StringExtension{ def static unifyFormatAndPrint(String str,boolean isUppercase){ if(isUppercase) println str.toUpperCase() else println str.toLowerCase() } }
- 接下來在清單文件中聲明其存在,在任意位置建一個文件夾企蹭,在該文件夾下放置如下的目錄結(jié)構(gòu):
新建文件夾/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule
在其中做如下聲明:moduleName=string_extension //自己制定的模塊名 moduleVersion=1.0-SNAPSHOT //自己制定的版本號 extensionClasses=StringExtension //逗號分隔的實(shí)例方法所在的包裝類 //extensionStaticClasses=..... //逗號分隔的實(shí)例方法所在的包裝類
- 使用
groovyc
命令將文件先編譯:
- 然后使用
jar
命令生成jar包
其中-cf
后指定輸出的包名白筹,-C classes . -C 新建文件夾 .
表示到暫時切換到該目錄下(注意不是-c
),后面的點(diǎn)號(.
)表示在當(dāng)前目錄下搜索谅摄。 - 下面開始使用這個包徒河,新建一個Groovy文件:
使用groovyc編譯,//use.groovy "hello Bon".unifyFormatAndPrint(true)
groovyc -d classes use.groovy
然后使用java
命令開始運(yùn)行送漠,注意上面提到的注意事項(xiàng):
java -classpath "%GROOVY_HOME%\embeddable\groovy-all-2.4.12.jar";ext.jar;classes use
【需要用到groovy-all-2.4.12.jar包以及剛才自己定義的拓展方法包ext.jar顽照,以及class文件路徑classes。注意C龉选代兵!分號后面不要留空格尼酿!;ext.jar;classes
不能寫成; ext.jar; classes
】
- 因?yàn)闆]有包聲明捍掺,則使用