前言
由於Groovy也是基於JVM的語言,以下幾種方式都需要先安裝和配置JDK;有關JDK安裝和配置和GroovySDK環境變量類似,所以可以參考第一種方式的GroovySDK環境變量的配置;
第一種方式
通過Groovy SDK配置環境變量,編譯運行代碼;通過Groovy同時基於JVM的語言,所有需要先安裝和配置JDK;有關JDK安裝和配置和GroovySDK環境變量類似,所以可以參考如下配置;
1.1,下載Groovy SDK並解壓到自己的存放路徑;
官方地址:http : //www.groovy-lang.org/download.html
1.2,配置GroovySDK的環境變量
右鍵“此電腦” —>“屬性” —>“系統高級設置” —>“環境變量” —>“系統變量”
點擊“系統變量”下的新建變量名輸入:GROOVY_HOME變量值:D:\ groovy-2.5.8 SDK(自己解壓路徑存放跟路徑)
再“系統變量”中找到路徑變量,雙擊雙擊或單擊編輯;新建%GROOVY_HOME%\ bin;最後依次單擊確定關閉窗口
1.3,驗證環境變量是否正確,命令行中輸入groovy -v運行出現如下:說明配置成功
C:\Users\Ang>groovy -v
Groovy Version: 2.5.8 JVM: 1.8.0_121 Vendor: Oracle Corporation OS: Windows 10
C:\Users\Ang>
如果出現“錯誤:找不到或無法加載主類org.codehaus.groovy.tools.GroovyStarter”說明環境變量配置的有問題;需要根據以上步驟排查問題;
1.4,啓動GroovySDK自帶的編輯器,命令中輸入groovyconsole運行,注意中間沒有空間;或者在SDK下bin目錄中找到groovy console.bat雙擊運行也可以;
1.5,編寫Groovy代碼,編譯運行看看效果;
1.6,可以CTRL + S保存爲.groovy格式的文件,例如:Test.groovy;然後在命令行中cd切換到Test.groovy文件的所在目錄運行groovy Test.groovy
C:\Users\Ang>cd Desktop
C:\Users\Ang\Desktop>groovy Test.groovy
HelloWorld!!
C:\Users\Ang\Desktop>
第二種方式
通過AndroidStudio創建的項目,build.gradle新建任務通過gradle編譯運行Groovy代碼;
2.1,首先要有AndroidStudio運行環境,這裏不是此處的重點,所以就不具體說了;
2.2,有了Android開發環境,就可以新建項目或者打開一個Androidstudio創建的Android項目;
2.3,在Project的build.gradle新建任務並編寫Groovy代碼,例如:
task(helloTask).doLast{
println("hello world")
add(2,8)
}
def add(a,b){
println("a+b="+(a+b));
}
2.4,由於需要gradle命令編譯運行Groovy代碼,所以也配置gradle的環境變量,gradle環境變量的配置和GroovySDK類似,就不做重複介紹了;下載路徑:https ://gradle.org/install/#manually
2.5,在AndroidStudio的終端終端中輸入命令gradle helloTask運行:
在Android項目的Project的build.gradle文件中新建
第三種方式
也是通過AndroidStudio提供的功能編譯運行;可以運行Java類型也可以是腳本類型的代碼
3.1,單擊androidStudio菜單控件的工具拖動單擊Groovy Consoles選項
3.2,進入Groovy Consoles立即編寫Groovy代碼例如:
class DemoGroovy{
static void main(String [] args){
println("Hello World")
haveFun();
}
def static haveFun() {
def x = 1.23
def result = ""
switch (x) {
case "foo":
result = "found foo"
System.out.println("result= " + result);
case "bar":
result += "bar"
System.out.println("result= " + result);
case [4, 5, 6, 'inList']:
result = "list"
System.out.println("result= " + result);
break
case 12..30:
result = "range"
System.out.println("result= " + result);
break
case Integer:
result = "integer"
System.out.println("result= " + result);
break
case Number:
result = "number"
System.out.println("result= " + result);
break
case { it < 3 }:
result = "number < 3"
System.out.println("result=" + result);
break
default:
result = "default"
System.out.println("result=" + result);
}
}
}
3.3,如下圖編譯運行;
運行結果:
第四種方式
Eclipse中安裝Groovy插件,通過Eclipse編寫Groovy代碼並編譯運行;
4.1,根據Eclipse找到對應的Groovy插件版本;版本要一致哦,例如我的Eclipse是4.9那對應的Groovy插件就是https://dist.springsource.org/release/GRECLIPSE/e4.9
各個版本Groovy插件:https : //github.com/groovy/groovy-eclipse/wiki
4.2,Eclipse中單擊幫助->安裝新軟件...->添加名稱自定義就好,位置填入對應版本號的Groovy插件
4.3,點擊添加開始加載插件,然後全選就好,點擊下一步開始下載插件,最後根據提示重啓Eclipse就OK了;
4.4,新建GroovyProject,自定義項目名稱,然後新建包名,包名自定義就好了;
4.5,快捷項目—新增—>其他。.--> Groovy —>新建Groovy類型(裏面可以選Java類型的或者腳本類型的或者其他)替代是Java類型的;
4.6,編寫Groovy代碼,編譯運行
Java類型的
package com.ang
class Demo1 {
static void main(String [] args) {
println("Hello World")
}
}
編譯運行Eclipse —>運行
打印輸出:Hello World
腳本類型的
package com.ang
def s = "你好"
println s
編譯運行Eclipse-> run選擇Groovy腳本
打印輸出:你好
第五種方式
通過Intellij Idea創建Groovy項目,由於AndroidStudio是在IDEA的基礎上開發的,所以第三種方式也可以在IDEA中實現;我的IDEA版本是2018.2.6;
5.1,需要有GroovySDK,第一種方式已經提供了下載安裝流程;
5.2,IDEA中文件->新建->項目->選擇Groovy項目,配置JDK(通過新找到的本機JDK安裝路徑)和GroovySDK(創建..配置本機的GroovySDK路徑);然後關閉Kotlin / JVM具體如下圖;點擊下一步(下一步)輸入項目名稱和項目存放路徑
5.3,創建包名,然後就可以編寫Groovy項目代碼了,可以創建Java類型的代碼,也可以創建腳本腳本類型;
Java類型代碼:快捷項目—>新建—>選擇Groovy類填充文件名
代碼如下
package com.ang
class Hello {
static void main(String[] args) {
println "HelloWorld"
}
}
編譯運行:右鍵運行Hello.main()或者Ctrl + Shift + 10再或者工具欄運行拖放選擇
你好,世界
腳本類型
創建方式和java類型代碼相似,唯一不同就是新建選擇Groovy Script;腳本代碼如下:
package com.ang
def s = "Groovy Study"
println(s)
編譯運行(和Java類型一樣):
最後,IDEA中新建一個Gradle項目,在build.gradle編寫第二種方式的任務,再以同樣的方式編譯運行Groovy代碼也是可以的;
第六種方式
通過創建Gradle插件(分爲腳本插件和對象插件,這裏使用的是對象插件)編譯運行Groovy代碼或者腳本;
1,AndroidStudio 新建或者打開一個Android項目
2,新建一個Java Libray module,module名字隨意,例如:lib;
3,將src\main\java 改爲src\main\groovy;
4,修改lib\build.gradle中的內容,修改後爲:
apply plugin: 'groovy'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation localGroovy()
}
sourceCompatibility = "1.7"
targetCompatibility = "1.7"
註釋:
apply plugin: 'groovy' 引入 groovy 插件,groovy 插件繼承了 java 插件。
implementation localGroovy() 引入 Gradle 所帶的 Groovy 庫。
5,修改新建lib默認的Java文件名和後綴,名字自定義後綴爲.groovy 這樣就可以編寫groovy語法的代碼了;
例如:MyGroovy.groovy
package com.ang.lib;
class MyGroovy {
static void main(String[] args) {
println "this is MyGroovy"
}
}
6,再lib\build.gradle中增加如下代碼,點擊同步;
task renameGroovyToJava {
doLast {
delete "$buildDir/classes/java"
File file = new File("$buildDir/classes/groovy")
// file.name = "java" 不行,會報錯
println file.renameTo("$buildDir/classes/java")
}
}
compileJava.finalizedBy compileGroovy
compileGroovy.finalizedBy renameGroovyToJava
7,回到MyGroovy.groovy文件中,左邊有可點擊綠色三角按鈕,點擊選擇Run 'MyGroovy.main()'編譯運行GroovyJava類型的代碼;
原理:當compileJava Task執行之後,開始執行附着在 compileJava 後面的 compileGroovy Task,compileGroovy Task執行後,再將 build\classes\groovy文件路徑修改爲build\classes\java。從而使 androidstudio 可以執行groovy編譯後的class文件。如果沒有修改會出現:
腳本類
腳本類型和Java類型類似只是寫法不同而已;例如修改MyGroovy.groovy 文件內容
寫好了groovy腳本沒有左邊的可點擊按鈕怎麼運行呢;其實也簡單,使用快捷鍵Alt+Shift+F10選擇MyGroovy運行;
或者點擊AndroidStudio工具欄編譯旁的下拉選擇MyGroovy,點擊三角按鈕編譯運行;
總結:其實還有很多方式運行Groovy代碼;
Groovy實現相關原理
groovy負責詞法,語法解析groovy文件,然後用ASM生成普通的java字節碼文件,供jvm使用。
Groovy代碼文件與class文件的對應關係
作爲基於JVM的語言,Groovy可以非常容易的和Java進行互操作,但也需要編譯成classfile後才能運行,所以瞭解Groovy代碼文件和class文件的對應關係,可以更好地理解Groovy的運行方式和結構。
對於沒有任何類定義
如果Groovy腳本文件裏只有執行代碼,沒有定義任何類(class),則編譯器會生成一個腳本的子類,類名和腳本文件的文件名一樣,而腳本的代碼會被包含在一個稱爲run的方法中,同時將會生成一個main方法,作爲整個腳本的入口。
對於僅有一個類
如果Groovy腳本文件裏僅包含一個類,而這個類的名字又和腳本文件的名字一致,這種情況下就和Java是一樣的,即生成與所定義的類一致的class文件,Groovy類都會實現groovy.lang.GroovyObject接口。
對於多個類
如果Groovy腳本文件包含一個或多個類,groovy編譯器會很樂意地爲每個類生成一個對應的類文件。如果想直接執行這個腳本,則腳本里的第一個類必須有一個靜態的main方法。
對於有定義類的腳本
如果Groovy腳本文件有執行代碼,並且有定義類,那麼所定義的類會生成對應的類文件,同時,腳本本身也會被編譯成一個腳本的子類,類名和腳本文件的文件名相同
groovy文件代碼主要分爲兩類:
第一類:java式以類形式編寫代碼第二類:腳本式
第一類典型代碼
class DemoGroovy{
//main方法程序入口
static void main(String [] args){
println("Hello World")
haveFun();
}
def static haveFun() {
def x = 1.23
def result = ""
switch (x) {
case "foo":
result = "found foo"
System.out.println("result= " + result);
case "bar":
result += "bar"
System.out.println("result= " + result);
case [4, 5, 6, 'inList']:
result = "list"
System.out.println("result= " + result);
break
case 12..30:
result = "range"
System.out.println("result= " + result);
break
case Integer:
result = "integer"
System.out.println("result= " + result);
break
case Number:
result = "number"
System.out.println("result= " + result);
break
case { it < 3 }:
result = "number < 3"
System.out.println("result=" + result);
break
default:
result = "default"
System.out.println("result=" + result);
}
}
}
第二類腳本的形式:
def word = "你好嗎?"
println word