
1 概述
Gradle
由于建構速度比
Maven
快,且比
Maven
靈活,是以很多後端的應用都使用了
Gradle
進行建構,但一個問題是,
Gradle
的多子產品項目比較難建構,再加上
Gradle
的更新非常快,這就給建構一個多子產品
Gradle
項目造成了不少的困難。
基于此出發點,本文提供了兩種形式的使用
Gradle
建構的
Spring Boot
多子產品項目:
-
Java + Gradle
-
Kotlin + Gradle + Kotlin DSL
為了減少出現各種錯誤的機率,步驟做得非常詳細(多圖預警),文末也附上了源碼,下面就一起來看看吧。
2 環境
-
Gradle 6.8.2
-
Spring Boot 2.4.3
-
Kotlin 1.4.30
-
Open JDK 11
3 Java + Gradle
Java + Gradle
主要步驟:
- 使用
建立項目Spring Initializer
- 修改
build.gradle
- 建立子產品
- 編寫子產品
- 運作
- 測試
3.1 建立項目
直接使用
IDEA
提供的
Spring Initializer
即可,建構工具選擇
Gradle
:
依賴:
建構完成後删除
src
目錄,因為根目錄屬于管理子產品目錄不提供運作的應用:
3.2 修改 build.gradle
build.gradle
這是最複雜的一步,并且
Gradle
版本更新的話步驟可能會不一樣,首先在底部添加一個空的
subprojects
接着把
dependencies
以及
test
移動進去:
最後一步是,在
subprojects
開頭,添加插件
apply
,根據預設初始化建立的
plugins
,逐一添加。
比如這裡預設使用了三個插件:
apply
到
subprojects
中:
3.3 建立子產品
File -> New -> Module
輸入子產品名即可,這裡的例子是建立兩個子產品:
-
service
-
app
建立好後如圖所示:
完成建立之後,把兩個子產品中的
build.gradle
除了
repositories
之外的全部删去,僅保留
repositories
3.4 編寫子產品
3.4.1 service
子產品
service
首先建立包,根據根目錄中的
group
建立:
接着編寫一個叫
TestService
的帶
@Service
注解的類,裡面包含一個
test
方法:
同時修改
service
子產品的
build.gradle
,添加
bootJar
jar
選項:
bootJar{
enabled = false
}
jar{
enabled = true
}
3.4.2 app
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 + Gradle + Kotlin DSL
Kotlin DSL
在原生
Gradle
(
Groovy DSL
)的基礎上進行改進,但同時文法也變得更加陌生,難度是以也加大了不少,不過這并沒有難倒筆者。建構多子產品的基本步驟與上面類似:
-
Spring Initializer
-
build.gradle.kts
4.1 建立項目
選擇
Kotlin
Gradle
同樣删除
src
4.2 修改 build.gradle.kts
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
,把一些必要選項勾選上:
這裡同樣建立兩個子產品:
-
app
-
service
同樣把兩個子產品中的
build.gradle.kts
删除其他部分留下
repositories
4.4 編寫子產品
4.4.1 service
service
首先根據根目錄的
build.gradle.kts
編寫
TestService
最後修改
build.gradle.kts
,加上
tasks.bootJar
與
tasks.jar
tasks.bootJar{
enabled = false
}
tasks.jar{
enabled = true
}
4.4.2 app
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 源碼
附上兩個例子的源碼:
- Github
- 碼雲
- CODE CHINA