Problem

This article would demo how to to share repositories and build scripts in gradle project with submodules, I would use gradle to build a project with two spring boot submodules which are both built by gradle too.

Environment

  • Mac OS
  • Gradle 6.7.1
  • IntelliJ IDEA 2019.3

Solution

The whole directory tree of the project is as follows, the root project contains two submodules app1 and app2, they are all managed by gradle.

root project
   |-- gradle
          |--wrapper
               |--gradle-wrapper.properties
   |-- settings.gradle
   |-- build.gradle
   |-- gradlew
   |-- app1
         |
         |--build.gradle
   
   |-- app2
         |--build.gradle 

File 1: The root project’s settings.gradle

rootProject.name = 'bswen-springboot23'
include 'app1'
include 'app2'

File 2: The root project’s build.gradle

This is the key point of sharing scripts in gradle projects with submodules.

buildscript {
    repositories {
        mavenLocal()
        maven { url 'https://maven.aliyun.com/repository/google/' }
        maven { url 'https://maven.aliyun.com/repository/public/' }
        maven { url 'https://maven.aliyun.com/repository/spring/' }
        maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' }
        maven { url 'https://maven.aliyun.com/repository/spring-plugin/' }

        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.3.2.RELEASE")
    }
}


plugins {
    id 'org.springframework.boot' version '2.3.2.RELEASE' apply false
    id 'io.spring.dependency-management' version '1.0.8.RELEASE' apply false
    id 'java'
}

repositories {
    mavenLocal()
    maven { url 'https://maven.aliyun.com/repository/google/' }
    maven { url 'https://maven.aliyun.com/repository/public/' }
    maven { url 'https://maven.aliyun.com/repository/spring/' }
    maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' }
    maven { url 'https://maven.aliyun.com/repository/spring-plugin/' }

    mavenCentral()
}

Pay attention to the plugins block as follows, the apply false means that the plugin is not required by the root project. Then submodules can apply these plugins by their needs, and the version of the plugins can be omited in the submodules’ bulid.gradle.

plugins {
    id 'org.springframework.boot' version '2.3.2.RELEASE' apply false
    id 'io.spring.dependency-management' version '1.0.8.RELEASE' apply false
    id 'java'
}

File 3: app1’s build.gradle

The submodule’s build.gradle is as follows:


plugins {
    id 'org.springframework.boot'
    id 'io.spring.dependency-management'
    id 'java'
}

group 'com.bswen.app1'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

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

test {
    useJUnitPlatform()
}

You can see that there is no plugin version info in the plugins block, and you also do not need the repositories and buildscript block in submodules.