參考文章:
概述
作為一個項目管理工具,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。
