Post

SpringBoot 多项目工程(基于Gradle)

SpringBoot 多项目工程(基于Gradle)

Gradle利用basic模板创建空父项目

1
2
3
4
mkdir spring-cloud-project
cd spring-cloud-project
# 初始化 gradle 根项目(选择 basic 类型)
gradle init --type basic --dsl groovy

初始化后根目录的结构

1
2
3
4
5
6
7
8
.
├── build.gradle       # 空
├── gradle
│   ├── ...
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle    # 只有项目名

其中核心为build.gradlesettings.gradle两个配置文件。

除了上述用命令行创建,也可通过IDEA先创建gradle为java-application的项目,然后手动删除src目录和修改build.gradle文件即可。

1
File -> New -> Project -> java -> build system(gradle)

image-20260530193101256

然后删除根项目中的/src文件夹和清空build.gradle的内容。(最终效果与命令行创建basic模板的gradle是一致的)

创建SpringBoot子项目

IDEA在根项目中创建Module

1
File -> New -> Module -> Generators(Spring Boot)

image-20260530194400173

依赖只添加Web用于测试

image-20260530194502028

新创建的子项目service1的目录,并删除其中的部分文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
# service1 目录
.
├── build.gradle
├── gradle            删除
│   └── wrapper
├── gradlew           删除
├── gradlew.bat       删除
├── HELP.md
├── service1.iml
├── settings.gradle   删除(子模块不需要)
└── src
    ├── main
    └── test

注:只保留根目录的 gradlewgradle/,统一管理Gradle。

在根项目的settings.gradle中添加子项目,纳入管理。

1
2
3
4
// settings.gradle
rootProject.name = 'spring-cloud-project'

include ':service1'

注:若IDEA的gradle工具刷新后(建议关闭IDEA重新加载项目)同时出现了根项目(spring-cloud-project)和子项目(service1),或出现了多个根项目(spring-cloud-project),则只保留一个根项目(spring-cloud-project),将其他的项目都删掉(unlink gralde project)。

image-20260530195836667

其他子项目也通过相同的方式创建。

配置 build.gralde 文件

1
2
3
4
5
6
7
8
my-springboot-multi-project/
├── build.gradle          // 父项目构建脚本
├── settings.gradle       // 声明包含哪些子项目
├── gradle.properties     // (可选)定义公共属性
├── module-service1/             // 子项目1
│   └── build.gradle
└── module-service2/             // 子项目2
    └── build.gradle

父项目 build.gradle

父项目的 build.gradle 主要用于(统一版本管理、统一仓库源、统一编译环境):

  • 定义公共插件(如 Java、Spring Boot)
  • 配置仓库(repositories)
  • 统一依赖版本(通过 extdependencyManagement
  • 应用通用配置到所有子项目(使用 subprojects
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
plugins {
    id 'org.springframework.boot' version '4.0.6' apply false
}

ext {
    set('springCloudVersion', '2025.1.0')
    set('springCloudAlibabaVersion', '2025.1.0.0')
}

allprojects {
    group = 'top.chc'
    version = '1.0.0'

    repositories {
        // 私有 Nexus(按需开启)
        // maven {
        //     name = '私有仓库'
        //     url  = 'http://nexus.example.com/repository/maven-public/'
        //     credentials {
        //         username = project.findProperty('nexusUser')     ?: ''
        //         password = project.findProperty('nexusPassword') ?: ''
        //     }
        //     allowInsecureProtocol = true   // 仅 http 时需要
        // }
        mavenCentral()
    }

}

subprojects {

    plugins.withType(JavaPlugin) {
        java {
            toolchain {
                languageVersion = JavaLanguageVersion.of(25)
            }
        }

        tasks.withType(JavaCompile).configureEach {
            options.encoding = 'UTF-8'
        }

        dependencies {
            implementation platform(
                    org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
            )
            implementation enforcedPlatform(
                    "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
            )
            implementation enforcedPlatform(
                    "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}"
            )
        }
    }

    plugins.withType(org.springframework.boot.gradle.plugin.SpringBootPlugin) {
        bootJar {
            enabled = true
        }
        jar {
            enabled = false
        }
    }
}
  • plugins指定springboot的项目版本
  • ext指定springcloud版本,springcloudalibaba版本
  • allprojects指定项目名称版本,maven仓库地址
  • subprojects 如果是Java项目指定Java版本;项目编码;springboot,springcloud,springcloudalibaba的BOM版本控制。如果是Springboot项目开启bootJar(编译成bootJar)关闭jar(不再编译成Jar)。

子项目 build.gradle

子项目只需要写需要的组件,不需要填写具体的版本号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
plugins {
    id 'java'
    id 'org.springframework.boot'
}

description = 'service1'

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webmvc'
    testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
    useJUnitPlatform()
}
This post is licensed under CC BY 4.0 by the author.