1. 程式人生 > >Gradle實戰系列(一)__初體驗

Gradle實戰系列(一)__初體驗

本系列文章主要目的並非要精通 Gradle ,而且是從應用的角度上,根據專案開發過程中,最經常用到的功能來說明如何從無到有建立自己的 Gradle 建構指令碼。

必要條件

在使用 Gradle 之前,首先假設讀者對於 Ant 及 Maven 已經有基本的認識並且有實際的使用經驗

準備工作

  1. 安裝 JDK ,在環境變數中設定 JAVA_HOME 。
  2. 下載 Gradle 壓縮檔,解壓縮後在環境變數中設定 GRADLE_HOME 為解壓縮後的資料夾路徑,例如:C:\gradle-3.3,並且將 Gradle 安裝目錄中的 bin 資料夾加入環境變數的 Path 變數中,例如:C:\gradle-3.3\bin。

從無到有

首先建立工程資料夾 gradle_sample ,並且在該資料夾下執行初始化指令

gradle init

執行成功後,會在資料夾中產生基本的檔案,其中 build.gradlesettings.gradle 這兩個檔案是主要的建構指令碼

[gradle_sample]
---[.gradle]
   ---[3.3]
       ---[taskArtifacts]
           ---fileHashes.bin
           ---fileSnapshots.bin
           ---taskArtifacts
.bin ---taskArtifacts.lock ---[gradle] ---[wrapper] ---gradle-wrapper.jar ---gradle-wrapper.properties ---build.gradle ---gradlew ---gradlew.bat ---settings.gradle

build.gradle

apply plugin: 'java'

repositories {
    jcenter()
}

dependencies {
    compile 'org.slf4j:slf4j-api:1.7.21'
testCompile 'junit:junit:4.12' }
  • apply plugin:表示執行過程將引入的外掛
  • repositories:表示執行過程中會從哪些倉庫中尋找依賴的 jar 包
  • dependencies:表示執行過程需要依賴的 jar 包

settings.gradle

rootProject.name = 'gradle_sample'
  • rootProject.name:表示專案名稱,也是建構完成後預設的包名

Hellow Gradle

執行下列命令建立程式碼的資料夾

mkdir src\main\java

在 src\main\java 就愛如第一支程式 Hello.java

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello Gradle");
    }
}

Gradle 執行時透過命令列傳入引數決定要執行哪些 task,一般重新建構整個工程至少會包含 cleanbuild 這兩個 task

gradle clean build

建構過程中可以看到除了引數傳入的兩個 task 之外,實際上還執行了其他預設被依賴的 task

:clean
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build

BUILD SUCCESSFUL

Total time: 1.252 secs

執行成功後可以在 gradle_sample\build\libs 這個路徑下看到根據專案名稱打包出來的 gradle_sample.jar

[gradle_sample]
---[.gradle]
   ---[3.3]
       ---[taskArtifacts]
           ---fileHashes.bin
           ---fileSnapshots.bin
           ---taskArtifacts.bin
           ---taskArtifacts.lock

---[build]
   ---[classes]
      ---[main]
          ---Hello.class
   
   ---[libs]
      ---gradle_sample.jar
   
   ---[tmp]
      ---[compileJava]
         ---[emptySourcePathRef]
      
       ---[jar]
           ---MANIFEST.MF

---[gradle]
   ---[wrapper]
       ---gradle-wrapper.jar
       ---gradle-wrapper.properties

---build.gradle
---gradlew
---gradlew.bat
---settings.gradle

還記得在 Hello.java 中有一個 main 方法,我們可以透過修改 build.gradle,加入一個task,讓 Gradle 自動幫我們執行這個 main 方法

 task run(type: JavaExec, dependsOn: 'build') {
    classpath = sourceSets.main.runtimeClasspath
    if(project.hasProperty('mainClass')){
        main = "${project.getProperty('mainClass')}"
    }
    doFirst {
        println "===== run begin"
    }
    doLast {
        println "===== run end"
    }
}

這是一個型別為 JavaExec 的 task, task 名稱為 run,是依賴於 build 之後執行的,在 task 主體中設定了 classpath, mainClass 引數表示帶有 main 方法的完整類名,透過 -P 可以將 mainClass 引數傳入 Gradle 執行, doFirst 及 doLast 可以在 task 執行前/後執行其他動作

gradle run -PmainClass=Hello

從執行結果中可以看出來, run 是在原本的 build 之後才執行的

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:assemble UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build UP-TO-DATE
:run
===== run begin
Hello Gradle
===== run end

BUILD SUCCESSFUL

Total time: 1.227 secs

設定包名及版本號

前面提到 rootProject.name 是預設的包名,在 build.gradle 透過 archivesBaseName 可以另外指定包名,同時透過設定 version 來指定版本號

archivesBaseName = 'sample.hello'
version = '1.0-SNAPSHOT'

重新執行後可以發現 jar 包名變成 sample.hello-1.0-SNAPSHOT.jar,除此之外也可以在 build.gradle 裡面透過修改執行 build 時包含的 task jar 來設定包名及版本號

jar {
    baseName = 'sample.hello'
    version = '1.0-SNAPSHOT'
}

以上是本文對 Gradle 的基本介紹,可以由此下載 build.gradle