SpringBoot+Gradle構建多模組專案
1 概述
Gradle
由於構建速度比
Maven
快,且比
Maven
靈活,因此很多後端的應用都使用了
Gradle
進行構建,但一個問題是,
Gradle
的多模組專案比較難構建,再加上
Gradle
的更新非常快,這就給構建一個多模組
Gradle
專案造成了不少的困難。
基於此出發點,本文提供了兩種形式的使用
Gradle
構建的
Spring Boot
多模組專案:
Java + Gradle
Kotlin + Gradle + Kotlin DSL
為了減少出現各種錯誤的機率,步驟做得非常詳細(多圖預警),文末也附上了原始碼,下面就一起來看看吧。
2 環境
Gradle 7。4
Spring Boot 2。6。4
Kotlin 1。6。10
OpenJDK 17
3
Java + Gradle
主要步驟:
使用
Spring Initializer
建立專案
修改
build。gradle
建立模組
編寫模組
執行
測試
3。1 建立專案
直接使用
IDEA
提供的
Spring Initializer
即可,構建工具選擇
Gradle
:
依賴:
構建完成後刪除src目錄
,因為根目錄屬於管理模組目錄不提供執行的應用:
3。2 修改
build。gradle
這是最複雜的一步,並且
Gradle
版本更新的話步驟可能會不一樣,
首先在底部新增一個空的subprojects
:
接著
把dependencies以及tasks.name('test')移動進去
:
最後一步是,
在subprojects開頭,新增外掛apply,根據預設初始化建立的plugins,逐一新增
。
比如這裡預設使用了三個外掛:
apply
到
subprojects
中:
3。3 建立模組
File -> New -> Module
:
輸入模組名即可,這裡的例子是建立兩個模組:
service
app
建立好後如圖所示:
完成建立之後,
把兩個模組中的build.gradle除了repositories之外的全部刪去
,僅保留
repositories
:
3。4 編寫模組
3。4。1
service
模組
首先
建立包
,根據根目錄中的
build。gradle
中的
group
建立:
接著編寫一個叫
TestService
的帶
@Service
註解的類,裡面包含一個
test
方法:
同時修改
service
模組的
build。gradle
,
新增bootJar以及jar選項
:
bootJar
{
enabled
=
false
}
jar
{
enabled
=
true
}
3。4。2
app
模組
同樣先
建立包
:
接著在
app
模組的
build。gradle
新增service模組的依賴
:
再建立啟動類以及一個
Controller
:
程式碼如下:
package
com。example。app
;
import
org。springframework。boot。SpringApplication
;
import
org。springframework。boot。autoconfigure。SpringBootApplication
;
@SpringBootApplication
(
scanBasePackages
=
“com。example”
)
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
();
}
}
注意,
因為Spring Boot無法自動識別其他模組下的類,所以需要手動處理一下,有三種方法
:
第一種:
使用@Import
,也就是
@Import(TestService。class)
第二種:
使用scanBasePackageClasses
,也就是
@SpringBootApplication(scanBasePackageClasses={TestService。class})
第三種:
使用scanBasePackages
,也就是例子中的程式碼
@SpringBootApplication(scanBasePackages = “com。example”)
3。5 執行
接下來就可以運行了,可以直接點選
Application
旁邊的綠色小三角:
或者從執行配置中選擇
Application
執行(
IDEA
自動建立的,原來的那個
JavaGradleApplication
帶一個×是因為啟動檔案已經刪除了,可以順便把該配置刪除):
沒問題的話就可以成功運行了:
同時瀏覽器訪問
localhost:8080/test
會出現
test
字樣:
3。6 測試
建立包和測試類:
package
com。example。test
;
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
(
classes
=
TestService
。
class
)
//需要引入對應的類
public
class
JavaGradleTest
{
@Autowired
private
TestService
service
;
@Test
public
void
test
()
{
System
。
out
。
println
(
service
。
test
());
}
}
接著進行測試:
當然測試也可以跑一下
Gradle
中的任務:
3。7 打包
打包的話直接執行
bootJar
即可:
會在
build/libs
下生成
JAR
包:
測試:
再次訪問
localhost:8080/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
(
“org。springframework。boot”
)
plugin
(
“io。spring。dependency-management”
)
plugin
(
“org。jetbrains。kotlin。jvm”
)
plugin
(
“org。jetbrains。kotlin。plugin。spring”
)
}
plugins中的kotlin是org.jetbrains.kotlin的簡寫
,在
subprjects
中注意加上即可。
4。3 建立模組
File -> New -> Module
,把一些必要選項勾選上:
這裡同樣建立兩個模組:
service
app
同樣把兩個模組中的
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。app
import
org。springframework。boot。SpringApplication
import
org。springframework。boot。autoconfigure。SpringBootApplication
@SpringBootApplication
(
scanBasePackages
=
[
“com。example”
])
class
Application
fun
main
(
args
:
Array
<
String
>)
{
SpringApplication
。
run
(
Application
::
class
。
java
,*
args
)
}
package
com。example。app。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。test
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
(
classes
=
[
TestService
::
class
])
class
KotlinTest
{
@Autowired
lateinit
var
service
:
TestService
@Test
fun
test
()
{
println
(
service
。
test
())
}
}
直接點選小三角測試即可:
測試透過。
4。7 打包
bootJar
即可:
同樣會在
libs
下生成
JAR
:
執行測試後沒有問題,這樣
Kotlin+Gradle+Kotlin DSL
的多模組
Spring Boot
專案就算建立完成了。
5 原始碼
附上兩個例子的原始碼:
Github
碼雲
GitCode