Gradle實戰系列(一)__初體驗
本系列文章主要目的並非要精通 Gradle ,而且是從應用的角度上,根據專案開發過程中,最經常用到的功能來說明如何從無到有建立自己的 Gradle 建構指令碼。
必要條件
在使用 Gradle 之前,首先假設讀者對於 Ant 及 Maven 已經有基本的認識並且有實際的使用經驗
準備工作
- 安裝 JDK ,在環境變數中設定 JAVA_HOME 。
- 下載 Gradle 壓縮檔,解壓縮後在環境變數中設定 GRADLE_HOME 為解壓縮後的資料夾路徑,例如:C:\gradle-3.3,並且將 Gradle 安裝目錄中的 bin 資料夾加入環境變數的 Path 變數中,例如:C:\gradle-3.3\bin。
從無到有
首先建立工程資料夾 gradle_sample ,並且在該資料夾下執行初始化指令
gradle init
執行成功後,會在資料夾中產生基本的檔案,其中 build.gradle 及 settings.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,一般重新建構整個工程至少會包含 clean 及 build 這兩個 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