參考文章:
概述
作為一個項目管理工具,maven已經流行了好多年,近幾年gradle的項目慢慢多了起來,對其做一個基本的了解還是非常必要的。
兩者定位相同,既然產生了gradle這個后來者,那maven有哪些不足呢?一般說來,maven的不足主要在2個方面:
1、不夠簡便。尤其當項目較大,依賴的jar包多的時候,pom文件會變的非常龐大,即使做了分段整理加了注釋,查找起來還是感覺內容太多,有些不方便;
2、不夠靈活。其實這個多數時候還好說,至少我的感受並不明顯。就是maven的構建過程是嚴格線性的(
參見文章),如果要做額外的操作,需要借助插件或者干脆自定義插件,這都是相對繁瑣的;
而gradle由於grovvy語言的支持,可以做到比xml簡化很多的配置文件,也可以自己靈活的控制編譯打包的過程。
目標
搭建一個springboot的項目,實現controller跟service的分離依賴
構建及打包測試
spring的gradle項目,可以利用https://start.spring.io進行構建,比如:
點擊Generate Project,即可下載到一個壓縮包,解壓導入idea,結構如下:
目錄結構跟maven項目非常類似,只是原來的pom.xml替換成了settings.gradle跟build.gradle兩個文件。settings主要用於設置父子模塊依賴一類的配置,用於跟其它模塊的交互,build則用於項目構建。
默認settings.gradle的內容只有項目名一行:rootProject.name = 'zzzgradletest'
默認build.gradle內容如下:
plugins{ id 'java' //這是個java項目,因為gradle可以構建多種語言項目 id 'org.springframework.boot' version '2.1.3.RELEASE' } apply plugin: 'io.spring.dependency-management' group 'com.study.wzy' version '1.0-SNAPSHOT' sourceCompatibility = 1.8 jar { // 打jar包的配置 baseName = 'mytest' version = '0.0.1' manifest { attributes "Manifest-Version": 1.0, 'Main-Class': 'com.study.wzy.GradletestApplication' } } repositories { //maven資源庫配置 mavenLocal() //優先使用本地庫,win下可以跟maven共用,mac os下未找到如何配置共用 mavenCentral() } configurations { compileOnly { //僅在編譯時依賴,此處為lombok使用,相關注解在編譯時生成getter、setter等 extendsFrom annotationProcessor } } dependencies { //依賴jar包,每個jar包坐標包含三個基本元素:group,name,version annotationProcessor 'org.projectlombok:lombok:1.18.6' compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.1.3.RELEASE' testCompile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.1.3.RELEASE' testCompile group: 'junit', name: 'junit', version: '4.12' //testCompile 表示作用域 }
運行idea右邊gradle下的build,可以生成jar包,java -jar xxx.jar 進行運行,可以訪問:
示例代碼:
運行jar:

訪問結果

拆解項目
將項目拆為2個module,分別存放controller跟service,利用gradle設置依賴關系,並進行測試。
idea中,file -> new Module ,選擇gradle跟java,next到底。創建service如下:
@Service public class TestService { public String getName(){ return "jack"; } }
web項目的啟動類代碼為:
@RequestMapping("/test") @RestController @SpringBootApplication public class GradletestApplication { public static void main(String[] args) { SpringApplication.run(GradletestApplication.class, args); } @Autowired private TestService testService; @RequestMapping("/mytest") public String mytest(){ return "hello " + testService.getName(); } }
在web項目,settings.gradle中引入service模塊:
rootProject.name = 'zzzgradletest' includeFlat 'zzzservicetest'
在web項目的build.gradle中設置
compile project(':zzzservicetest')
引入service並進行依賴,gradle分別進行編譯后就可以進行訪問測試了

另:以上建立的兩個模塊是獨立的,沒有在同一個project下,因此本例中將共同的依賴放到了service中,這樣web在依賴了service后會根據依賴傳遞,依賴到spring的相關jar。若service跟web兩個module都在同一個gradle的project下,則可以將共同的配置放到project的build.gradle中,而且在new module后會自動在project的setting.gradle中生成 include 'zzzservice' 類似的代碼,此時,則不用在web中配置includeFlat ‘xxxxxxx’了,includeFlat的含義是引用一個同級模塊。
鑒於gradle的版本不同,有些配置也會略有區別,比如2.1及以上版本用plugins,而低版本則用apply plugin 。
暫時這樣,一個簡單的demo,用於熟悉gradle。