Gradle
因为构建速度比Maven
快,且比Maven
灵活,所以不少后端的应用都使用了Gradle
进行构建,但一个问题是,Gradle
的多模块项目比较难构建,再加上Gradle
的更新很是快,这就给构建一个多模块Gradle
项目形成了很多的困难。java
基于此出发点,本文提供了两种形式的使用Gradle
构建的Spring Boot
多模块项目:git
Java + Gradle
Kotlin + Gradle + Kotlin DSL
为了减小出现各类错误的几率,步骤作得很是详细(多图预警),文末也附上了源码,下面就一块儿来看看吧。github
Gradle 6.8.2
Spring Boot 2.4.3
Kotlin 1.4.30
Open JDK 11
Java + Gradle
主要步骤:web
Spring Initializer
建立项目build.gradle
直接使用IDEA
提供的Spring Initializer
便可,构建工具选择Gradle
:spring
依赖:后端
构建完成后删除src
目录,由于根目录属于管理模块目录不提供运行的应用:api
build.gradle
这是最复杂的一步,而且Gradle
版本更新的话步骤可能会不同,首先在底部添加一个空的subprojects
:浏览器
接着把dependencies
以及test
移动进去:bash
最后一步是,在subprojects
开头,添加插件apply
,根据默认初始化建立的plugins
,逐一添加。app
好比这里默认使用了三个插件:
apply
到subprojects
中:
File -> New -> Module
:
输入模块名便可,这里的例子是建立两个模块:
service
app
建立好后如图所示:
完成建立以后,把两个模块中的build.gradle
除了repositories
以外的所有删去,仅保留repositories
:
service
模块首先建立包,根据根目录中的group
建立:
接着编写一个叫TestService
的带@Service
注解的类,里面包含一个test
方法:
同时修改service
模块的build.gradle
,添加bootJar
以及jar
选项:
bootJar{ enabled = false } jar{ enabled = true }
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(); } }
接下来就能够运行了,能够直接点击Application
旁边的绿色小三角:
或者从运行配置中选择Application
运行(IDEA
自动建立的,原来的那个DemoApplication
带一个×是由于启动文件已经删除了,能够顺便把该配置删除):
没问题的话就能够成功运行了:
同时浏览器访问localhost:8080/test
会出现test
字样:
在建立测试类以前,也须要先建立包,且须要确保包名与启动类的包名一致:
再建立测试类:
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
项目就成功了。
Kotlin + Gradle + Kotlin DSL
Kotlin DSL
在原生Gradle
(Groovy DSL
)的基础上进行改进,但同时语法也变得更加陌生,难度所以也加大了很多,不过这并无难倒笔者。构建多模块的基本步骤与上面相似:
Spring Initializer
建立项目build.gradle.kts
选择Kotlin
+Gradle
:
依赖:
一样删除src
:
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
中注意加上便可。
File -> New -> Module
,把一些必要选项勾选上:
这里一样建立两个模块:
app
service
一样把两个模块中的build.gradle.kts
删除其余部分留下repositories
:
service
模块首先根据根目录的build.gradle.kts
建立包:
编写TestService
:
最后修改build.gradle.kts
,加上tasks.bootJar
与tasks.jar
:
tasks.bootJar{ enabled = false } tasks.jar{ enabled = true }
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() }
点击main
旁边的绿色小三角便可:
运行成功:
一样能够访问localhost:8080/test
:
注意在编写测试以前须要保证测试类与启动类在同一个包下,也就是须要先建立包:
再建立测试类:
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
项目就算建立完成了。
笔者在实践的过程当中也遇到了无数的错误,好比找不到类,或者build.gradle
/build.gradle.kts
文件错误,幸亏有万能的搜索引擎,帮笔者解决了错误,最后才成功写下这篇文章。
总的来讲,Gradle
建立多模块项目要比Maven
要难,并且Gradle
的更新速度很快,语法变化较大,相比之下Maven
很是稳定,最新的Maven 3.6.3
仍是19年11月发布的,然而Gradle
都准备7.0
了:
笔者建议,若是是真的须要使用Gradle
,须要考虑一下团队的情况,毕竟上手难度要大于Maven
,若是在Gradle
建立多模块的过程当中遇到一些极其难以解决的问题,转为Maven
不失为一个好办法。
附上两个例子的源码: