SpringBoot+Gradle构建多模块项目
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;
@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
,把一些必要选项勾选上:
这里同样创建两个模块:
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.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 源码
附上两个例子的源码:
SpringBoot+Gradle构建多模块项目的更多相关文章
- IDEA中使用springBoot+gradle构建多模块项目
https://blog.csdn.net/forMelo/article/details/78995875
- Gradle构建多模块项目(转)
废话不多说,直接进入主题. 1. 创建项目 首先创建项目,名称为 test: mkdir test && cd test gradle init 这时候的项目结构如下: ➜ test ...
- Gradle构建多模块项目
通常我在使用Maven构建项目的时候是将应用项目划分为多个更小的模块. Gradle 项目也拥有多于一个组件,我们也将其称之为多项目构建(multi-project build). 我们首先创建一个多 ...
- 【转载】Gradle构建多模块项目
本文转载自:https://yq.aliyun.com/articles/25589写的非常好! 改动如下: 1. 增加了一些[补充说明]. 2. 将执行命令使用较为显眼的博客园样式. 3. 将输出结 ...
- Eclipse Gradle 构建多模块项目
注意: 1.Eclipse不如IDEA智能,Eclipse建立的Gradle Project项目在目录级别上是同级的; 2.user-web模块如果要引用user-service模块,直接引用是找不到 ...
- 使用Gradle构建多模块SpringBoot项目
使用Gradle构建多模块SpringBoot项目 本项目使用Gradle构建SpringBoot项目,将不同的业务进行不同的模块划分(不做微服务与分布式架构); - 编辑器:Intellij IDE ...
- Spring-Boot构建多模块项目
Spring-Boot构建多模块项目 功能模块单独项目开发,可以将一个庞大的项目分解成多个小项目,便于细分开发 Maven多模块项目不能独立存在,必须有一个介质来包含. 1.创建一个Maven 项目, ...
- 基于SpringBoot构建分模块项目
前言 步骤过于详细,多图慎入!!! 假设一个场景,要开发一个4s店维修部的办公系统,其功能有:前台接待,维修抢单,财务结算,库存管理.于是我们创建一个项目balabalabala写完交工. 一段时间后 ...
- 用Gradle构建Spring Boot项目
相比起Maven的XML配置方式,Gradle提供了一套简明的DSL用于构建Java项目,使我们就像编写程序一样编写项目构建脚本.本文将从无到有创建一个用Gradle构建的Spring Boot项目, ...
随机推荐
- python 第三方库paramiko
目录 介绍 三种常用方式 使用密码进行登录 使用密钥免密码登录 SFTP 传输文件 terminal demo 介绍 paramiko是什么可以参考其他人的博客或文章,这里不再赘述,直入正题. 本次测 ...
- java基础第12期——反射、注解
一. 反射 反射: 将类的各个组成部分封装为其他对象. 1.1 获取class对象的方式 Class.forName("全类名"): 将字节码文件加载进内存,返回class对象 多 ...
- Django Admin 配置和定制基本功能(基本二次开发配置)
一 列表显示页面 1. list_display,列表时,定制显示的列 @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdm ...
- 微信小程序:解决小程序中有些格式如webpiPhone手机暂不支持的问题
问题:小程序中有些格式是iPhone手机暂不支持的,如goods_introduce中的webp格式,在小程序的模拟器中是可以正常显示webp格式的,但是一旦你做真机调试,很可能某些iPhone手机是 ...
- Python爬虫系统化学习(3)
一般来说当我们爬取网页的整个源代码后,是需要对网页进行解析的. 正常的解析方法有三种 ①:正则匹配解析 ②:BeatuifulSoup解析 ③:lxml解析 正则匹配解析: 在之前的学习中,我们学习过 ...
- 第46天学习打卡(四大函数式接口 Stream流式计算 ForkJoin 异步回调 JMM Volatile)
小结与扩展 池的最大的大小如何去设置! 了解:IO密集型,CPU密集型:(调优) //1.CPU密集型 几核就是几个线程 可以保持效率最高 //2.IO密集型判断你的程序中十分耗IO的线程,只要大于 ...
- ubuntu上pyecharts V1版本环境搭建
1 背景 今天想用pyecharts画图,在新的环境下使用pip安装之后发现,导入pyecharts模块一直失败,报错如下. 图 1 导入pyecharts错误图 请注意:我这里使用的python版本 ...
- vscode中js文件使用typescript语法报错,如何解决
原因:由于vcode自身的语法检查有些问题 解决办法:在设置里面加上 "javascript.validate.enable": false 禁用默认的 js 验证 总结: 由于v ...
- POJ1458 Common Subsequence
题目链接:http://poj.org/problem?id=1458 分析:最大公共子序列模板 1 #include<iostream> 2 #include<sstream> ...
- Linux速通 大纲
1.Linux操作系统安装及初始化配置(熟悉) 2.Linux操作系统目录组成结构及文件级增删改查操作(重点) 3.Linux操作系统用户.权限管理(重点) 4.开源软件及Linux下软件包的管理(重 ...