开始改造之前写的单机springboot项目的时候,在用gradle创建多层级项目的时候就遇到了问题,csdn+google的中文社区都没有找到解决办法,最后通过官方文档解决(麻了)

在此记录

示例项目地址:https://github.com/MomentDerek/teamsystem-cloud-template

父项目初始化

首先,创建项目后立马暂停依赖的自动下载,开始编辑依赖:

本文的参考gradle为7.4,6.x版本会有部分api区别(主要体现在dependencyManagement的mavenBom及其相关插件名称上,但应该是直接能用的,6.4.1编译通过)

初始build.gradle记录:

plugins {
    id 'org.springframework.boot' version '2.3.12.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
}

allprojects {
    repositories {
        maven {
            url 'https://maven.aliyun.com/repository/central'
        }
        mavenCentral()
    }
}

subprojects {

    ext {
        springBootVersion = "2.3.12.RELEASE"
        springCloudVersion = "Hoxton.SR12"
        springCloudAlibabaVersion = "2.2.7.RELEASE"
        lombokVersion = "1.18.22"
    }

    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'maven-publish'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '1.8'
    targetCompatibility = '1.8'

    // java编译的时候缺省状态下会因为中文字符而失败
    [compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8'

    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter'
        implementation "org.springframework.boot:spring-boot-starter-web"
        implementation 'org.springframework.boot:spring-boot-starter-actuator'

        implementation "com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery"
        implementation "org.springframework.cloud:spring-cloud-starter-openfeign"

        //lombok
        compileOnly "org.projectlombok:lombok:${lombokVersion}"
        annotationProcessor "org.projectlombok:lombok:${lombokVersion}"


        testImplementation('org.springframework.boot:spring-boot-starter-test') {
            exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
        }
    }

    dependencyManagement {
        imports {
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
            mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}"
        }
    }

    test {
        useJUnitPlatform()
    }
}

编辑完build.gradle后开始下载依赖

然后删除多余的src文件夹及其他多余文件

创建多级子模块

创建gradle子模块,取消所有框架的勾选

image.png

父项选择父模块

如果还有三级子模块需要创建,则继续,否则创建完成(idea会帮你完成二级父子项目的配置,这里应该是没坑的)

在子模块上右键新建模块,这里父项需要为None(可以观察一下位置的路径,需要在子模块的下面创建三级子模块)

image.png

创建后删除多余的文件夹,只留build.gradle和settings.gradle

image.png

创建完成的样子如下

image.png

然后编辑父模块的settings.gradle,加入所有子模块:

rootProject.name = 'teamsystem-cloud'
include 'teamsystem-api'
include 'teamsystem-api:teamsystem-feign'
include 'teamsystem-api:teamsystem-consumer-test'
include 'teamsystem-api:teamsystem-provider-test'

此时有个非常非常重要的步骤,在idea的gradle窗口中把除父项目的gradle编译项全部删掉!

因为在gradle刷新后会自动在父模块下创建子模块的编译项

image.png

解决子模块之间的依赖问题

如上面创建的项目,consumer-test和provider-test依赖于feign模块的接口,而feign本身没有启动项,那么此时,需要如下编辑各个模块的build.gradle

首先要在feign的build.gradle中加入jar.enabled=true,否则无法被其他两个子模块依赖(因为没有启动类,默认不会被编译成jar包)

然后是在consumer-test和provider-test中加入feign模块的依赖

dependencies {
    implementation project(':teamsystem-api:teamsystem-feign')
}

完成后同步依赖即可完成创建

结果

应该如下(子模块的settings.gradle可以删掉,目前没有太大的影响)

image.png