SpringBoot+Gradle构建多模块项目

1 概述

Gradle因为构建速度比Maven快,且比Maven灵活,所以不少后端的应用都使用了Gradle进行构建,但一个问题是,Gradle的多模块项目比较难构建,再加上Gradle的更新很是快,这就给构建一个多模块Gradle项目形成了很多的困难。java

基于此出发点,本文提供了两种形式的使用Gradle构建的Spring Boot多模块项目:git

  • Java + Gradle
  • Kotlin + Gradle + Kotlin DSL

为了减小出现各类错误的几率,步骤作得很是详细(多图预警),文末也附上了源码,下面就一块儿来看看吧。github

2 环境

  • Gradle 6.8.2
  • Spring Boot 2.4.3
  • Kotlin 1.4.30
  • Open JDK 11

3 Java + Gradle

主要步骤:web

  • 使用Spring Initializer建立项目
  • 修改build.gradle
  • 建立模块
  • 编写模块
  • 运行
  • 测试

3.1 建立项目

直接使用IDEA提供的Spring Initializer便可,构建工具选择Gradlespring

在这里插入图片描述

依赖:后端

在这里插入图片描述

构建完成后删除src目录,由于根目录属于管理模块目录不提供运行的应用:api

在这里插入图片描述

3.2 修改build.gradle

这是最复杂的一步,而且Gradle版本更新的话步骤可能会不同,首先在底部添加一个空的subprojects浏览器

在这里插入图片描述

接着dependencies以及test移动进去bash

在这里插入图片描述

最后一步是,subprojects开头,添加插件apply,根据默认初始化建立的plugins,逐一添加app

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

在这里插入图片描述

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 源码

附上两个例子的源码:

相关文章
相关标签/搜索