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

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

    在这里插入图片描述

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

    附上两个例子的源码:

  • 相关阅读:
    Python Day 24 类属性与对象属性、初始化方法init、绑定方法与非绑定方法、OOP三大特性之继承、抽象与继承、存在继承关系后的属性查找、派生与覆盖、子类中重用父类的方法
    Python Day 23 xml模块 、面向对象
    Python Day 22 configparser模块、subprocess模块、xlrd模块、xlwt模块
    LeetCode 两个数之和
    python ATM + 购物车
    python Day 19 random、json、pickle、hashlib、hmac、shutil、shelve
    Python Day 18 time模块、datetime模块、os模块、os.path模块
    解释型语言和编译型语言的区别
    GCC和G++区别
    安装python+setuptools+pip+nltk
  • 原文地址:https://www.cnblogs.com/6b7b5fc3/p/14471256.html
Copyright © 2020-2023  润新知