作者:像風一樣
來源:https://www.cnblogs.com/yueshutong/p/9898578.html
Gradle構建工具從入門到精通(IDEA)

1.Gradle安裝

Gradle構建工具從入門到精通(IDEA)

官網下載壓縮包,然後解壓,配置本地環境變量。主要有下面兩個:

GRADLE_HOME 是解壓後的目錄,

GRADLE_USER_HOME 的作用是讓其他程序檢測到本地.gradle文件夾的位置,

再把 %GRADLE_HOME%\bin 追加到 Path 環境變量中。

Gradle構建工具從入門到精通(IDEA)

然後在D:\.gradle目錄下新建init.gradle文件,使用記事本打開粘貼下列代碼:

allprojects{
repositories {
def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
remove repo
}
}
}
maven {
url REPOSITORY_URL
}
}
}

即可更換maven倉庫地址爲國內阿里雲鏡像。

2.Groovy語法

打開IDEA,點擊Tools,找到Groovy Console,單擊。

Gradle構建工具從入門到精通(IDEA)

輸入一些Groovy語法,單擊綠色按鍵運行程序。

Gradle構建工具從入門到精通(IDEA)

上面的程序省略了傳參時的括號(),運行結果如下圖:

Gradle構建工具從入門到精通(IDEA)

Groovy字符串的特性

  1. 'a':只是字符串
  2. "a":裏面可以連接變量$(b)
  3. '''a''':裏面的字符串可以換行

list:

def buildTools=['ant','maven']
//添加list
buildTools << 'gradle'

map

def buildYears=['ant':2000,'maven':2004]
//添加map
buildYears.gardle=2009

閉包

閉包是一個代碼塊,語法如下:

{ [closureParameters -> ] statements }

其中[]內是可選的閉包參數,可省略。當閉包帶有參數,就需要->來將參數和閉包體相分離。示例:

def c1={ v -> println v }

3.Gradle腳本

新建gradle Java項目的默認腳本文件內容:

plugins {
id 'java'
}
group 'cn.zyzpp'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}

解讀腳本:

  1. 方法調用基本都省略了(),比如 group('cn.zyzpp')
  2. 還有給參數設值 X=x
  3. 使用閉包{}來作爲參數執行repositories()、dependencies()方法,這倆方法的調用同樣忽略了()的書寫

4.IDEA使用Gradle

4.1 新建Gradle程序。

Gradle構建工具從入門到精通(IDEA)

插件命令說明:

  1. jar用於將文件編譯爲jar包;
  2. build會執行build.gradle文件,由於插件是Java,所以也會將文件編譯爲jar包;
  3. classes會將文件轉爲class文件;
  4. clean會清除操作 ;

4.2 我們執行jar命令後,在libs目錄下找到生成的jar包。

Gradle構建工具從入門到精通(IDEA)

4.3 執行命令行

java -classpath build/libs/useGradle-1.0-SNAPSHOT.jar cn.zyzpp.App

輸出結果:

Gradle構建工具從入門到精通(IDEA)

5.打包web項目

新建Gradle項目時選擇web,點擊war命令進行打包。

Gradle構建工具從入門到精通(IDEA)

爲什麼會有war命令,因爲plugins方法閉包參數內調用id(“war”)方法。

Gradle構建工具從入門到精通(IDEA)

6.projects、tasks

Gradle 裏的任何東西都是基於這兩個基礎概念:

  • projects ( 項目 )
  • tasks ( 任務 )

每一個構建都是由一個或多個 projects 構成的. 一個 project 到底代表什麼依賴於你想用 Gradle 做什麼. 舉個例子, 一個 project 可以代表一個 JAR 或者一個網頁應用.

每一個 project 是由一個或多個 tasks 構成的. 一個 task 代表一些更加細化的構建. 可能是編譯一些 classes, 創建一個 JAR, 生成 javadoc, 或者生成某個目錄的壓縮文件.

7.自定義任務

首先應該明白,gradle自帶了很多task。

在build.gradle中添加自定義task很簡單,代碼如下:

//自定義一個方法,這裏是創建目錄
def createDir = {
path ->
File file = new File(path);
if (!file.exists()){
file.mkdirs();
}
}
//自定義第一個task任務
task makeGroovyDir(){
def paths = ["src/main/groovy"];
doFirst {
paths.forEach(createDir);
}
}
//自定義第二個task任務
task makeJavaDir(){
dependsOn 'makeGroovyDir' //該任務依賴於某個任務
def paths = ["src/main/java2"];
doFirst {
paths.forEach(createDir);
}
}

運行圖如下:

Gradle構建工具從入門到精通(IDEA)

8.構建生命週期

初始化完成後的方法 -> 配置完成後的方法 -> 執行完成後的方法

Gradle構建工具從入門到精通(IDEA)

9.依賴管理

幾乎所有的基於JVM的軟件項目都需要依賴外部類庫來重用現有的功能。自動化的依賴管理可以明確依賴的版本 ,解決因傳遞性依賴帶來的版本衝突。

9.1 依賴倉庫位置

工件座標 group name version

常用倉庫

1 mavenLocal() / mavenCentral() / jcenter

2 自定義maven倉庫

repositories {
maven{
url '私服地址一般放首位'
}
mavenLocal() //本地倉庫
mavenCentral() //中央倉庫
}

3 文件倉庫(不推薦使用)

9.2 依賴的傳遞性

b 依賴a 如果c依賴b 那麼c依賴a

9.3 依賴的階段

testCompile是在測試的編譯階段,其它如runtime等。

編譯階段的依賴在運行時也是存在的。典型的例子是JDBC驅動實現,項目主代碼的編譯只需要jdk提供的jdbc的接口,只有在執行測試或者運行測試的時候才需要實現上述接口的jdbc的驅動。

dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile group: 'org.jsoup', name: 'jsoup', version: '1.10.3'
}

10.版本衝突

查看版本衝突,執行dependencies任務

Gradle構建工具從入門到精通(IDEA)

1.gradle默認會使用高版本的依賴

2.取消默認策略,如果有版本衝突,直接讓其構建失敗

configurations.all{
resolutionStrategy{
failOnVersionConflict()
}
}

3.排除傳遞性依賴(默認排除最低版本)

//排除哪個jar的依賴
compile('org.spring-core:3.6.3.Final'){
//指定要排除的依賴的group和module=name,不指定版本,默認排除最低版本
exclude group:'org.slf4j',module:'slf4j-api'
//transitive=false//排除所有傳遞性依賴,比較少用
}

4.強制指定默認使用某個版本

configurations.all{
resolutionStrategy{
force 'org.slf4j:slf4j-api:1.7.24'
}
}

備註:IDEA可能會不提示,但不要緊,依執行結果爲據。

11.多項目構建

11.1 新建模塊

Gradle構建工具從入門到精通(IDEA)

我們新建一個web模塊,新建成功後如下:

Gradle構建工具從入門到精通(IDEA)

可以看到在新模塊裏生成了一個build.gradle文件,並且setting.gradle文件中新增了include ‘web’語句。

11.2 依賴模塊

我們可以再次新建model模塊。如果我們想在model模塊使用web模塊的類,如何寫呢?

dependencies {
compile project(":web") //這裏是模塊名
...
}

現在通過gradle插件,查看到項目有root根模塊,model模塊,web模塊。

Gradle構建工具從入門到精通(IDEA)

11.3 全局配置

我們可以在root根模塊設置全局配置,比如在root模塊使用allprojects:

allprojects{
apply plugin : 'java'
sourceCompatibility = 1.8
}

去掉其它模塊的 plugin : 'java',可以看到該模塊依舊存在 jar 任務。

也可以使用subprojects配置這個項目的子項目:

subprojects {
dependencies {
compile 'ch.qos.logback:logback-classic:1.2.1'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
}

11.4 統一配置

統一項目的版本,只需要在項目目錄下新建gradle.properties文件,寫入

group = 'cn.zyzpp'
version = '1.0-SNAPSHOT'

然後去掉其它配置文件的該內容即可。

11.5 個性化配置

在web模塊添加war插件,只需要在web模塊下的build.gradle寫入

plugins{
id 'war'
}

11.6 總結

當多項目構建時,每個子項目下的配置只是對與根項目不同的個性化配置。

所有相同的配置,建議還是在根項目下配置。

12.自動化測試

如果在test目錄下編寫了測試代碼,在build構建項目時會自動運行這些測試代碼並生成一些類似報表的html或xml。如圖所示:

Gradle構建工具從入門到精通(IDEA)

打開該HTML如圖所示:

Gradle構建工具從入門到精通(IDEA)

13.發佈

在項目的build.gradle中加入:

apply plugin: 'maven-publish'//添加maven發佈插件
//配置發佈
publishing{
//把什麼發佈到倉庫
publications{
//方法名自定義
myPublish(MavenPublication){
from components.java//java產生的輸出發佈到倉庫
}
}
//發佈的位置
repositories{
maven{
mame 'myRepo'
url '私服地址,然後執行publish即可發佈到私服'
}
}
}

此時會看到Gradle project的選項卡的配置了發佈信息的項目的Tasks下多出了publishing任務組,執行組下publishToMavenLocal即可發佈到本地倉庫,到本地倉庫即可看到發佈的信息。其它命令:

  • publishes:發佈到本地maven倉庫
  • installs:發佈到依賴緩存
  • uploads:發佈到遠程倉庫

14.常用語句

// 解決打包無main函數,不包含其它依賴
jar {
manifest {
attributes(
"Manifest-Version": 1.0,
"Main-Class": "cn.zyzpp.App")//修改此處
}
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
into('assets') {
from 'assets'
}
}
// 解決編譯GBK編碼問題
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}

從Maven轉Gradle還是比較容易的

相關文章