先通过IDEA创建一个Gradle的Java项目,并把src目录删除,其目录如下:

gradle-multi-projects

  • gradle
    • wrapper
      • gradle-wrapper.jar
      • gradle-wrapper.properties
  • build.gradle
  • gradlew
  • gradlew.bat
  • settings.gradle

接下来我们将从这个项目开始改造成一个多模块的SpringBoot项目。

引入插件

引入插件比较推荐buildscript的方式,这里我们需要引入两个插件:

  • spring-boot-gradle-plugin:该插件会检测何时应用某些其他插件并做出相应反应。例如,当java应用插件时,会自动配置构建可执行 jar 的任务。简单地针对我们项目来说,就是帮忙我们构建可执行的jar包。
  • dependency-management-plugin:依赖管理插件,提供了类似于maven中pom形式的依赖管理。
    1. buildscript {
    2. repositories {
    3. mavenLocal()
    4. maven { url 'https://maven.aliyun.com/repository/public/' }
    5. mavenCentral()
    6. }
    7. ext {
    8. springBootVersion = "2.6.6"
    9. springDependencyManagementVersion = '1.0.11.RELEASE'
    10. }
    11. dependencies {
    12. classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    13. classpath("io.spring.gradle:dependency-management-plugin:${springDependencyManagementVersion}")
    14. }
    15. }

应用插件

前面只是引入了参与构建的插件,下面我们需要应用这些插件:

buildscript {
    ...
}

allprojects {
    group = 'com.example'
    version = '1.0.0-SNAPSHOT'

    apply plugin: 'java'
    apply plugin: 'io.spring.dependency-management'

    // 指定JDK的版本
    sourceCompatibility = '11'
    targetCompatibility = '11'

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

    // springboot依赖管理,子模块如果添加了springboot相关的依赖,可以不指定springboot版本
    // 整个项目下的springboot都由这里统一控制
    dependencyManagement {
        imports {
            mavenBom "org.springframework.boot:spring-boot-starter-parent:${springBootVersion}"
        }
    }
}

subprojects {
    // 由于根项目只是用来管理整个项目,并不需要引入springboot的插件
    // 该插件为:org.springframework.boot:spring-boot-gradle-plugin
    apply plugin: 'org.springframework.boot'
}

Junit测试

buildscript {
    ...
}

allprojects {
    ...
}

subprojects {
    apply plugin: 'org.springframework.boot'

    dependencies {
        ...
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        ...
    }

    test {
        useJUnitPlatform()
    }
}

新增子模块

前面讲到,settings.gradle所在的目录会被gradle认为是根项目,所以我们需要在根目录下新建一个文件夹,其名称为子模块的名称,如sub-module-1,并在该子模块目录下放置一个空的build.gralde文件(存在此文件才能参与gradle的构建任务),同时在settings.gradle中引入当前模块:

rootProject.name = 'gradle-multi-projects'
include('sub-module-1')

其文件目录如下:

gradle-multi-projects

  • gradle
    • wrapper
      • gradle-wrapper.jar
      • gradle-wrapper.properties
  • sub-module-1
    • build.gradle
  • build.gradle
  • gradlew
  • gradlew.bat
  • settings.gradle

假如该子模块为Web模块,我们可以在子模块的build.gralde引入对应的依赖:

dependencies {
    // 由于通过mavenBom进行了springboot的依赖版本管理,这里我们不需要指定其版本
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

假如该模块不是可执行的模块,只是放置一些common的常量,工具等,我们需要在其build.gralde 进行配置:

bootJar {
    enabled = false
}

jar {
    enabled = true
}

假如该模块的构建依赖于另一个子模块,我们需要在其build.gralde 进行配置:

dependencies {
    // 冒号后为子模块的模块名称,对应到settings.gradle中引入的模块名称
    implementation project(':sub-common-mudole')
}

参考资料