Gradle多模块开发框架搭建(Springboot)

搭建过程

搭建环境:IDEA 2202.3.2
项目框架:Springboot3.0.2
项目名称:Muhammad
项目结构:Muh-app(子模块:项目启动入口,调取Muh-Design模块资源)、Muh-Design(子模块,设计模块)

1.原始状态

使用Spring Initializer创建项目,构建工具选择Gradle

项目创建成功后,目录结构为:
xxxxx
  |— .gradle
  |— .idea
  |— gradle
    |— wrapper:Gradle命令的包装,能够让机器在不安装Gradle的情况下运行程序,便于团队开发过程中统一Gradle构建版本
  |— src
  |— .gitignore
  |— build.gradle:管理依赖包的配置文件(相当于Maven的pom.xml)
  |— gradlew:Gradle命令的包装(Linux版),当机器上没有Gradle时,可以使用gradlew命令构建项目
  |— gradlew.bat:Gradle命令的包装(Windows版),当机器上没有Gradle时,可以使用gradlew命令构建项目
  |— HELP.md
  |— settings.gradle:可以视为多模块项目总目录,Gradle通过该配置构建各模块,并组织模块间的关系

2.构建完成后,删除多余目录

删除src目录(父级项目不提供代码运行,仅用于模块管理)

3.创建子模块

  1. 创建子模块Muh-app:项目启动模块(统一入口)
  2. 创建子模块Muh-design:知识库-设计相关
  3. 删除两个子模块的多余文件和文件夹:.gitignoreHELP.mdsettings.gradle
  4. 两个模块构建完成后,清空两个模块中build.gradle配置文件的所有配置信息(子模块的相关配置以后可以在根项目的build.gradle配置文件中统一管理)
  5. 删除子模块Muh-design的启动类src/main/java/com/xfather/muhdesign/MuhDesignApplication.java和测试启动类src/test/java/com/xfather/muhdesign/MuhDesignApplicationTests.java

4.修改根项目的build.gradle文件

  1. 添加全局配置allprojects

    allprojects {
       // 将以下内容移动到allprojects配置中
        group = 'com.xfather'
        version = '0.0.1-SNAPSHOT'
        sourceCompatibility = '17'
        targetCompatibility = '17'
    
       // 将plugins中的所有插件引入到全局配置中(根据默认初始化的plugins逐一添加)
        apply plugin:'java'
        apply plugin: 'org.springframework.boot'
        apply plugin: 'io.spring.dependency-management'
    
        repositories {
            mavenCentral()
        }
    }
    
  2. 添加子模块配置subprojects

    // 适用于子模块配置
    subprojects {
       dependencies {
          implementation 'org.springframework.boot:spring-boot-starter'
          developmentOnly 'org.springframework.boot:spring-boot-devtools'
          testImplementation 'org.springframework.boot:spring-boot-starter-test'
       }
    }
    
  3. 添加特定模块配置(各子模块个性化配置在这里添加)

    // 特定项目配置
    project(':Muh-app'){
       dependencies {
          // Muh-app项目是Web应用启动入口,需要引入spring-boot-starter-web
          implementation 'org.springframework.boot:spring-boot-starter-web'
          // 添加项目依赖(给Muh-app项目引入Muh-design项目依赖)
          implementation project(':Muh-design')
       }
    }
    
    // 特定项目配置
    project(':Muh-design'){
    
    }
    
  4. 删除多余的task.name('test')配置

  5. 附:完整build.gradle文件配置

    // 插件管理
    plugins {
        id 'java'
        // springboot插件依赖
        id 'org.springframework.boot' version '3.0.2'
        // 版本管理插件依赖
        id 'io.spring.dependency-management' version '1.1.0'
    }
    
    // 全局配置管理(适用于所有模块【含子模块】)
    allprojects {
        group = 'com.xfather'
        version = '0.0.1-SNAPSHOT'
        sourceCompatibility = '17'
        targetCompatibility = '17'
    
        apply plugin:'java'
        apply plugin: 'org.springframework.boot'
        apply plugin: 'io.spring.dependency-management'
    
        repositories {
            mavenCentral()
        }
    }
    
    // 适用于子模块配置
    subprojects {
        dependencies {
            implementation 'org.springframework.boot:spring-boot-starter'
            developmentOnly 'org.springframework.boot:spring-boot-devtools'
            testImplementation 'org.springframework.boot:spring-boot-starter-test'
        }
    }
    
    // 特定项目配置
    project(':Muh-app'){
        dependencies {
            implementation 'org.springframework.boot:spring-boot-starter-web'
            // 添加项目依赖(声明对Muh-design模块的依赖)
            implementation project(':Muh-design')
        }
    }
    
    // 特定项目配置
    project(':Muh-design'){
    
    }
    

5.修改根项目的settings.gradle配置文件

引入项目引用,增加以下配置

// 此处要按照加载顺序依次配置
include('Muh-design','Muh-app')

6.在Muh-design模块中创建测试服务

  1. 创建com.xfather.muhdesign.service.TestService
  2. 添加测试服务
    public String hello(){
         return "Hello,I'm Muh-design";
    }
    
  3. TestService增加@Service注解

7.在Muh-app模块中创建测试控制

  1. 创建com.xfather.muhapp.controller.TestController
  2. 添加测试调用
    TestService service;
    
    TestController(TestService service){
      this.service = service;
    }
    
    @GetMapping("hello")
    public String hello(){
      return service.hello();
    }
    
  3. TestController增加@RestController注解

8.修改Springboot包扫描

因为Springboot无法自动识别其他模块下的类,因此需要手动处理,有三种方法:

  1. 第一种:使用@Import导入对应的类
    如:在controller中增加@Import(TestService.class)
  2. 第二种:在@SpringBootApplication上增加scanBasePackageClasses设定
    即:@SpringBootApplication(scanBasePackageClasses = {TestService.class})
  3. 第三种:在@SpringBootApplication上增加scanBasePackage设定
    即:@SpringBootApplication(scanBasePackages = "com.xfather")

9.启动测试

启动MuhAppApplication,访问 http://127.0.0.1:8080/hello 即可看到运行结果

常见问题

  1. Task ‘prepareKotlinBuildScriptModel’ not found in project:
    问题原因:Gradle的某些版本中可能存在该问题,怀疑与Kotlin插件有关
    解决办法一:在build.gradle文件中增加一个空的task来掩盖这个问题

    task prepareKotlinBuildScriptModel {}
    

    tasks.register("prepareKotlinBuildScriptModel"){}
    

    解决办法二:禁用IDEA的Kotlin插件

    文件 ——> 设置 ——> 插件 ——> 已安装 ——> 禁用Kotlin
    
  2. 无法自动装配,未找到"XXX"类型的Bean
    问题原因:因为Springboot无法自动识别其他模块下的类,因此需要手动处理,有三种方法:
    解决方法一:在对应controller上使用@Import导入对应的类

    如:在controller中增加`@Import(TestService.class)`
    

    解决方法二:在@SpringBootApplication上增加scanBasePackageClasses设定

    即:`@SpringBootApplication(scanBasePackageClasses = {TestService.class})`
    

    解决方法三:在@SpringBootApplication上增加scanBasePackage设定

    即:`@SpringBootApplication(scanBasePackages = "com.xfather")` 
    
  3. Gradle如何打包和测试
    测试:
    在IDEA右侧Gradle面板中打开待测试项目,依次分别为:Tasks ——> verification ——> test即可进行测试
    打包:
    在IDEA右侧Gradle面板中打开待打包项目,依次分别为:Tasks ——> build ——> bootJar即可进行打包,打包完成后会生成到该项目build/libs目录下

  4. 提交git报错:does not have a commit checked out
    问题原因:子模块创建时,同时创建了.git隐藏文件夹,导致子模块被识别为独立管理的版本
    解决办法:删除子模块下.git文件夹重新提交即可

猜你喜欢

转载自blog.csdn.net/Asgard_Hu/article/details/128832478