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,逐一添加

比如这里默认使用了三个插件:

applysubprojects中:

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在原生GradleGroovy 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中的kotlinorg.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.bootJartasks.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构建多模块项目的更多相关文章

  1. IDEA中使用springBoot+gradle构建多模块项目

    https://blog.csdn.net/forMelo/article/details/78995875

  2. Gradle构建多模块项目(转)

    废话不多说,直接进入主题. 1. 创建项目 首先创建项目,名称为 test: mkdir test && cd test gradle init 这时候的项目结构如下: ➜ test ...

  3. Gradle构建多模块项目

    通常我在使用Maven构建项目的时候是将应用项目划分为多个更小的模块. Gradle 项目也拥有多于一个组件,我们也将其称之为多项目构建(multi-project build). 我们首先创建一个多 ...

  4. 【转载】Gradle构建多模块项目

    本文转载自:https://yq.aliyun.com/articles/25589写的非常好! 改动如下: 1. 增加了一些[补充说明]. 2. 将执行命令使用较为显眼的博客园样式. 3. 将输出结 ...

  5. Eclipse Gradle 构建多模块项目

    注意: 1.Eclipse不如IDEA智能,Eclipse建立的Gradle Project项目在目录级别上是同级的; 2.user-web模块如果要引用user-service模块,直接引用是找不到 ...

  6. 使用Gradle构建多模块SpringBoot项目

    使用Gradle构建多模块SpringBoot项目 本项目使用Gradle构建SpringBoot项目,将不同的业务进行不同的模块划分(不做微服务与分布式架构); - 编辑器:Intellij IDE ...

  7. Spring-Boot构建多模块项目

    Spring-Boot构建多模块项目 功能模块单独项目开发,可以将一个庞大的项目分解成多个小项目,便于细分开发 Maven多模块项目不能独立存在,必须有一个介质来包含. 1.创建一个Maven 项目, ...

  8. 基于SpringBoot构建分模块项目

    前言 步骤过于详细,多图慎入!!! 假设一个场景,要开发一个4s店维修部的办公系统,其功能有:前台接待,维修抢单,财务结算,库存管理.于是我们创建一个项目balabalabala写完交工. 一段时间后 ...

  9. 用Gradle构建Spring Boot项目

    相比起Maven的XML配置方式,Gradle提供了一套简明的DSL用于构建Java项目,使我们就像编写程序一样编写项目构建脚本.本文将从无到有创建一个用Gradle构建的Spring Boot项目, ...

随机推荐

  1. (转)IP协议详解之子网寻址、子网掩码、构造超网

    原文网址:http://www.cnblogs.com/way_testlife/archive/2010/10/05/1844399.html 子网寻址 1. 从两级IP地址到三级IP地址 < ...

  2. sublime 使用过程中遇到的问题

    1.当我把鼠标放置在下图所示的class上几秒钟后,sublime就会在全局查找当前的class字符,这时sublime就会出现卡顿或无响应 解决方法: 点击preferences下的settings ...

  3. Nginx(八): 观进程锁的实现

    前面的nginx系列讲解了nginx很多通用概念,流程,以及核心的http模块的一些实现.应该说大体上对nginx已经不再陌生和神秘. 今天我们不看全局,只看一个非常非常小的细节:nginx是多进程并 ...

  4. 后端程序员之路 54、go 日志库

    一个朋友写的日志库 https://github.com/vizee/echo go get -u -v github.com/vizee/echo package main import (    ...

  5. 你不知道的Scheduled定时任务骚操作

    目录 一.什么是定时任务 二.项目依赖 三.注解式定时任务 3.1 cron 3.2 fixedDelay 3.3 fixedDelayString 3.4 fixedRate 3.5 fixedRa ...

  6. Reincarnation Without New Body(RWNB): Basic Theory and Baseline 现世转生基本理论及简单操作

    Abstract 投胎学是一门高深的学问,不仅没有现存的理论,也没有过往的经验.根据种种猜测,投胎后前世的记忆也不能保留,造成了很大的不方便.在本文中,我们绕过了投胎需要"来世"的 ...

  7. C# 应用 - 使用 HttpListener 接受 Http 请求

    1. 库类: \Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\System.dll System.Net.HttpListen ...

  8. HDU_6695 Welcome Party 【思维】

    一.题目 Welcome Party 二.分析 最开始的时候分析错了,认为只要找两个类型中的最小差值就可以了,忽略了是求两个类型中最大值的最小差值. 那么可以对第一个类型进行从大到小排序,枚举这个类型 ...

  9. python inspect库

    一.介绍 inspect模块用于收集python对象的信息,可以获取类或函数的参数的信息,源码,解析堆栈,对对象进行类型检查等等. inspect模块主要提供了四种用处: 对是否是模块.框架.函数进行 ...

  10. 【odoo14】第二十一章、性能优化

    通过odoo框架,我们可以开发大型且复杂的应用.良好的性能是实现这一目标的基础.本章,我们将探讨如何提高应用性能.同时,我们也会讲解找出影响性能的因素. 本章包含以下内容: 记录集的预读取模式 将数据 ...