使用Gradle構建項目

使用Gradle構建項目
http://blog.javachen.com/2014/09/15/build-project-with-gradle.html

Gradle 是一款基于 Groovy 語言、免費開源的構建工具,它既保持了 Maven 的優點,又通過使用 Groovy 定義的 DSL 克服了 Maven 中使用 XML 繁冗以及不靈活的缺點。

Gradle 官方網站:http://www.gradle.org/downloads

安裝

一種方式是從 官方 下載解壓然后配置環境變量。

Mac 上安裝:

$ brew install gradle

測試是否安裝成功:

$ gradle -v

------------------------------------------------------------
Gradle 2.12
------------------------------------------------------------

Build time:   2016-03-14 08:32:03 UTC
Build number: none
Revision:     b29fbb64ad6b068cb3f05f7e40dc670472129bc0

Groovy:       2.4.4
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.7.0_80 (Oracle Corporation 24.80-b11)
OS:           Mac OS X 10.11.6 x86_64

簡單使用

Gradle 使用 約定優于配置(Convention over Configuration)的理念。使用與maven兼容的目錄結構布局。完全按照約定的目錄結構來布置工程文件,會大大簡化編譯配置文件。

除了常見的src/main/java等目錄,默認的 web 應用程序根目錄為 src/main/webapp,也就是包含 WEB-INF 目錄的上一級目錄。如果工程沒有完全依照約定布局,可以通過腳本文件指定相應的路徑。

Gradle 中有兩個最基本的對象:project 和 task。每個 Gradle 的構建由一個 project 對象來表達,它代表著需要被構建的組件或者構建的整個項目。每個 project 對象由一個或者多個 task 對象組成。

Gradle 已經自帶了很多 pugins,可以滿足大部分的常見構建任務。

Gradle 的默認構建腳本文件為工程根目錄下的 build.gradle。

創建項目

作為測試,創建一個 test 目錄,然后通過下面命令來初始化一個項目:

$ mkdir test
$ cd test
$ gradle init
:wrapper
:init

BUILD SUCCESSFUL

Total time: 3.058 secs

$ ls
build.gradle    gradle          gradlew         gradlew.bat     settings.gradle

可以看到生成了 gradle 的一些配置文件。接下來在 build.gradle 文件中添加下面代碼,可以支持生成 jar 包:

apply plugin: 'java'

這就是你定義一個Java項目所需要做的一切。這就會在你項目里使用Java插件,該插件會給你的項目增加很多任務。

Gradle 期望在 src/main/java 路徑下找到你項目的源代碼,并且測試在 src/test/java 路徑下的代碼。同時,在src/main/resources 路徑下的文件也會作為資源文件包含在JAR包中,并且 src/test/resources 下的所有文件會包含在 classpath 下以運行測試程序。所有的輸出文件都生成在 build 目錄下,JAR 包生成在 build/libs 目錄下。

運行下面命令即可生成 jar 包:

$ gradle jar

如果 jar 包中有一個包含 main 方法的主類,想讓其打包之后能夠運行其 main 方法,則需要添加下面代碼:

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.javachen.gradle.HelloWorld'
    }
}

通常,JAR 包需要被發布到某個地方。為了完成這個功能,你需要告訴 Gradle 把 JAR 包發布到哪里。在 Gradle 中,如 JAR 之類的壓縮包都被發布到庫中。在我們的樣例中,我們將會發布到本地倉庫。你也可以發布到一個或多個遠端地址。

發布 jar 包添加如下配置:

uploadArchives {
    repositories {
       flatDir {
           dirs 'repos'
    } }
}

此外,你還可以添加下面代碼,引入 Eclipse 插件以支持生成 Eclipse 工程:

apply plugin: 'eclipse'

添加Maven庫:

repositories {
    mavenCentral()
}

如果想添加依賴,也是非常簡單,例如添加 spring 依賴:

apply plugin: 'java'
dependencies {
    compile 'org.springframework:spring-context:3.2.6.RELEASE'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

gradle 便會自動地到 maven 服務器下載 spring-context-3.2.6.RELEASE.jar,以及它所依賴的 jar 包。

常用的依賴:

  • (1)compile:編譯生產代碼的依賴環境,即src/main/下
  • (2)runtime:生產代碼運行時的依賴(包含編譯生產代碼時的依賴)
  • (3)testCompile:編譯測試代碼的依賴環境,即src/test下
  • (4)testRuntime:測試代碼運行時的依賴(包含編譯測試代碼時的依賴)

當然,也可以直接依賴本地的 jar 包,例如:

apply plugin: 'java'
dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
}

也可以通過 buildscript{} 中添加依賴的方式,將相關 jar 包加入到 classpath 中,如:

buildscript {  
    repositories {  
        mavenCentral()  
    }  
    dependencies {  
        classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'  
    }  
}

綜上,完成的配置如下:

apply plugin: 'java'
apply plugin: 'eclipse'

jar {
    manifest {
        attributes 'Main-Class': 'com.javachen.gradle.HelloWorld'
    }
}

repositories {
    mavenLocal()
    mavenCentral()
    mavenRepo urls: "http://repository.sonatype.org/content/groups/forge/"
}

dependencies {
    compile 'org.springframework:spring-context:3.2.6.RELEASE'
    testCompile group: 'junit', name: 'junit', version: '4.+'
    compile fileTree(dir: 'libs', include: '*.jar')
}

buildscript {  
    repositories {  
        mavenLocal()
        mavenCentral()
        mavenRepo urls: "http://repository.sonatype.org/content/groups/forge/"
    }  
    dependencies {  
        classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'  
    }  
}  

uploadArchives {
    repositories {
        flatDir {
            dirs 'repos'
        }
    }
}

其他使用

創建項目目錄結構

gradle 不像 maven 那樣有固定的項目結構,gradle 原聲 API 是不支持的,要想做到這一點,我們可以自定義一個 task。

apply plugin: 'idea'
apply plugin: 'java'
apply plugin: 'war'

task createJavaProject << {
  sourceSets*.java.srcDirs*.each { it.mkdirs() }
  sourceSets*.resources.srcDirs*.each { it.mkdirs()}
}

task createWebProject(dependsOn: 'createJavaProject') << {
  def webAppDir = file("$webAppDirName")
  webAppDir.mkdirs()
}

然后運行下面命令:

$ gradle createJavaProject

另外,還可以使用 gradle templates 創建項目目錄結構,這里不做研究。

更加標準的方法是使用 gradle 自帶的插件創建項目目錄結構,例如創建 java 項目結構:

$ gradle init --type java-library

這時候的目錄結果如下:

$ tree -L 4
.
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   └── java
    │       └── Library.java
    └── test
        └── java
            └── LibraryTest.java

7 directories, 8 files

如果想要導入到 idea 中,先執行下面命令:

$ gradle idea

這時候的 build.gradle 如下:

apply plugin: 'idea'
apply plugin: 'java'
apply plugin: 'war'

task createJavaProject << {
      sourceSets*.java.srcDirs*.each { it.mkdirs() }
        sourceSets*.resources.srcDirs*.each { it.mkdirs()}
}

task createWebProject(dependsOn: 'createJavaProject') << {
      def webAppDir = file("$webAppDirName")
        webAppDir.mkdirs()
}

將Java項目從maven遷移到gradle

如何將一個 java 項目從maven遷移到 gradle 呢?gradle 集成了一個很方便的插件:Build Init Plugin,使用這個插件可以很方便地創建一個新的 gradle 項目,或者將其它類型的項目轉換為 gradle 項目。

要將 maven 項目轉換為 gradle 項目,只需要在項目的 pom 文件所在的目錄下執行以下命令:

$ gradle init --type pom

上面的命令會根據 pom 文件自動生成 gradle 項目所需的文件和配置,然后以 gradle 項目重新導入即可。

參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,829評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,923評論 6 342
  • 什么是Gradle? Gradle是一種依賴管理工具,基于Groovy語言,面向Java應用為主,它拋棄了基于XM...
    MrMagicWang閱讀 384評論 0 1
  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項,請點擊這里進行查閱:DSL參考 1.1新構建系統...
    Chuckiefan閱讀 12,166評論 8 72
  • 一份溫馨的情愫 六月十日,天氣放晴,我們一行七人參加朱志東老師女兒回門宴熱鬧而溫馨。 有幸和王溢作協的各位老師認...
    小河映月閱讀 337評論 2 2