1 概述
Gradle由於構建速度比Maven快,且比Maven靈活,因此很多后端的應用都使用了Gradle進行構建,但一個問題是,Gradle的多模塊項目比較難構建,再加上Gradle的更新非常快,這就給構建一個多模塊Gradle項目造成了不少的困難。
基於此出發點,本文提供了兩種形式的使用Gradle構建的Spring Boot多模塊項目:
Java + GradleKotlin + Gradle + Kotlin DSL
為了減少出現各種錯誤的概率,步驟做得非常詳細(多圖預警),文末也附上了源碼,下面就一起來看看吧。
2 環境
Gradle 6.8.2Spring Boot 2.4.3Kotlin 1.4.30Open JDK 11
3 Java + Gradle
主要步驟:
- 使用
Spring Initializer創建項目 - 修改
build.gradle - 創建模塊
- 編寫模塊
- 運行
- 測試
3.1 創建項目
直接使用IDEA提供的Spring Initializer即可,構建工具選擇Gradle:

依賴:

構建完成后刪除src目錄,因為根目錄屬於管理模塊目錄不提供運行的應用:

3.2 修改build.gradle
這是最復雜的一步,並且Gradle版本更新的話步驟可能會不一樣,首先在底部添加一個空的subprojects:

接着把dependencies以及test移動進去:

最后一步是,在subprojects開頭,添加插件apply,根據默認初始化創建的plugins,逐一添加。
比如這里默認使用了三個插件:

apply到subprojects中:

3.3 創建模塊
File -> New -> Module:

輸入模塊名即可,這里的例子是創建兩個模塊:
serviceapp


創建好后如圖所示:

完成創建之后,把兩個模塊中的build.gradle除了repositories之外的全部刪去,僅保留repositories:


3.4 編寫模塊
3.4.1 service模塊
首先創建包,根據根目錄中的group創建:


接着編寫一個叫TestService的帶@Service注解的類,里面包含一個test方法:

同時修改service模塊的build.gradle,添加bootJar以及jar選項:
bootJar{
enabled = false
}
jar{
enabled = true
}

3.4.2 app模塊
同樣先根據根目錄的group創建包:

接着在app模塊的build.gradle添加service模塊的依賴:

再創建啟動類以及一個Controller:

代碼如下:
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
package com.example.controller;
import com.example.service.TestService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TestController {
private final TestService service;
@GetMapping("/test")
public String test(){
return service.test();
}
}
3.5 運行
接下來就可以運行了,可以直接點擊Application旁邊的綠色小三角:

或者從運行配置中選擇Application運行(IDEA自動創建的,原來的那個DemoApplication帶一個×是因為啟動文件已經刪除了,可以順便把該配置刪除):

沒問題的話就可以成功運行了:

同時瀏覽器訪問localhost:8080/test會出現test字樣:

3.6 測試
在創建測試類之前,也需要先創建包,且需要確保包名與啟動類的包名一致:

再創建測試類:

package com.example;
import com.example.service.TestService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class JavaTest {
@Autowired
private TestService service;
@Test
public void test(){
System.out.println(service.test());
}
}
接着進行測試:

這樣使用Java+Gradle構建一個多模塊的Spring Boot項目就成功了。
4 Kotlin + Gradle + Kotlin DSL
Kotlin DSL在原生Gradle(Groovy DSL)的基礎上進行改進,但同時語法也變得更加陌生,難度因此也加大了不少,不過這並沒有難倒筆者。構建多模塊的基本步驟與上面類似:
- 使用
Spring Initializer創建項目 - 修改
build.gradle.kts - 創建模塊
- 編寫模塊
- 運行
- 測試
4.1 創建項目
選擇Kotlin+Gradle:

依賴:

同樣刪除src:

4.2 修改build.gradle.kts
同樣在尾部添加一個空的subprojects:

把dependencies以及tasks移動進去:


最后在subprojects開始處apply插件,根據默認的插件進行apply:

代碼如下:
apply{
plugin("io.spring.dependency-management")
plugin("org.springframework.boot")
plugin("org.jetbrains.kotlin.plugin.spring")
plugin("org.jetbrains.kotlin.jvm")
}
plugins中的kotlin是org.jetbrains.kotlin的簡寫,在subprjects中注意加上即可。
4.3 創建模塊
File -> New -> Module,把一些必要選項勾選上:

這里同樣創建兩個模塊:
appservice


同樣把兩個模塊中的build.gradle.kts刪除其他部分留下repositories:

4.4 編寫模塊
4.4.1 service模塊
首先根據根目錄的build.gradle.kts創建包:


編寫TestService:

最后修改build.gradle.kts,加上tasks.bootJar與tasks.jar:
tasks.bootJar{
enabled = false
}
tasks.jar{
enabled = true
}

4.4.2 app模塊
先創建包:

添加對service模塊的依賴:

再創建一個啟動類以及一個Controller:

代碼如下:
package com.example
import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication
@SpringBootApplication
class Application
fun main(args:Array<String>) {
SpringApplication.run(Application::class.java,*args)
}
package com.example.controller
import com.example.service.TestService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
@RestController
class TestController {
@Autowired
lateinit var service: TestService
@GetMapping("/test")
fun test() = service.test()
}
4.5 運行
點擊main旁邊的綠色小三角即可:

運行成功:

同樣可以訪問localhost:8080/test:

4.6 測試
注意在編寫測試之前需要保證測試類與啟動類在同一個包下,也就是需要先創建包:

再創建測試類:

package com.example
import com.example.service.TestService
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
@SpringBootTest
class KotlinTest {
@Autowired
lateinit var service: TestService
@Test
fun test(){
println(service.test())
}
}
直接點擊小三角測試即可:

測試通過,這樣Kotlin+Gradle+Kotlin DSL的多模塊Spring Boot項目就算創建完成了。
5 總結
筆者在實踐的過程中也遇到了無數的錯誤,比如找不到類,或者build.gradle/build.gradle.kts文件錯誤,幸好有萬能的搜索引擎,幫筆者解決了錯誤,最后才成功寫下這篇文章。
總的來說,Gradle創建多模塊項目要比Maven要難,而且Gradle的更新速度很快,語法變化較大,相比之下Maven非常穩定,最新的Maven 3.6.3還是19年11月發布的,然而Gradle都准備7.0了:


筆者建議,如果是真的需要使用Gradle,需要考慮一下團隊的狀況,畢竟上手難度要大於Maven,如果在Gradle創建多模塊的過程中遇到一些極其難以解決的問題,轉為Maven不失為一個好辦法。
6 源碼
附上兩個例子的源碼:
