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
次要步骤:
- 应用
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
:
输出模块名即可,这里的例子是创立两个模块:
service
app
创立好后如图所示:
实现创立之后,把两个模块中的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;@SpringBootApplicationpublic 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;@SpringBootTestpublic 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
,把一些必要选项勾选上:
这里同样创立两个模块:
app
service
同样把两个模块中的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.exampleimport org.springframework.boot.SpringApplicationimport org.springframework.boot.autoconfigure.SpringBootApplication@SpringBootApplicationclass Applicationfun main(args:Array<String>) { SpringApplication.run(Application::class.java,*args)}
package com.example.controllerimport com.example.service.TestServiceimport org.springframework.beans.factory.annotation.Autowiredimport org.springframework.web.bind.annotation.GetMappingimport org.springframework.web.bind.annotation.RestController@RestControllerclass TestController { @Autowired lateinit var service: TestService @GetMapping("/test") fun test() = service.test()}
4.5 运行
点击main
旁边的绿色小三角即可:
运行胜利:
同样能够拜访localhost:8080/test
:
4.6 测试
留神在编写测试之前须要保障测试类与启动类在同一个包下,也就是须要先创立包:
再创立测试类:
package com.exampleimport com.example.service.TestServiceimport org.junit.jupiter.api.Testimport org.springframework.beans.factory.annotation.Autowiredimport org.springframework.boot.test.context.SpringBootTest@SpringBootTestclass 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