Gradle плагин зависимостей в мультимодульном Spring проекте загрузки

Как выглядит правильная конфигурация Gradle в проекте с несколькими модулями, в котором используются плагины Gradle spring-boot-dependencies и spring-boot?

У меня есть следующая настройка проекта:

parent
  |
  + build.gradle
  |
  + alpha
  |   |
  |   + build.gradle
  |
  + beta
  |   |
  |   + build.gradle
  • Модуль parent содержит общую конфигурацию проекта.
  • Модуль alpha - это модуль, в котором я хотел бы импортировать зависимости, используя номера версий, указанные в spring -boot-dependencies bom, но результат стандартной банки.
  • Модуль beta - это модуль, который зависит от alpha, а результатом является исполняемый файл Spring Boot jar (включая все зависимости). Следовательно, для этого проекта необходимы как spring-boot-dependencies, так и плагин spring-boot.

Чтобы сохранить файлы Gradle DRY, я извлек общие скрипты модулей в родительский файл build.gradle.

Попытки выполнить $ gradle build с использованием конфигурации проекта ниже приводят к:

> Plugin with id 'io.spring.dependency-management' not found.

родительский gradle.build

allprojects {
    group = "com.example"
    version '0.0.1-SNAPSHOT'

    ext {
        dependencyManagementPluginVersion = '0.5.3.RELEASE'
        springBootVersion = '1.3.0.RC1'
    }

    apply plugin: 'java'
    apply plugin: 'eclipse'
    apply plugin: 'idea'
}

subprojects {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8

    buildscript {
        repositories {
            jcenter()
            maven { url "https://repo.spring.io/snapshot" }
            maven { url "https://repo.spring.io/milestone" }
        }
        dependencies {
            classpath("io.spring.gradle:dependency-management-plugin:${dependencyManagementPluginVersion}")
            classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        }
    }

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

    dependencyManagement {
        imports {
            mavenBom("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")
//            mavenBom("org.springframework.boot:spring-boot-starter-parent:${springBootVersion}")
        }
    }
}

alpha build.gradle

dependencies {
    compile('org.springframework:spring-web')
}

beta gradle.build

apply plugin: 'spring-boot'

dependencies {
    compile project(':alpha')
    compile('org.springframework.boot:spring-boot-starter')
    compile('org.springframework.boot:spring-boot-starter-web')
}

Комментарии:

  • Поведение плагина spring-boot было изменено в Spring Boot 1.3.0.M1
  • Gradle версия: 2.8
  • Spring Загрузочная версия 1.3.0.RC1

Ответы

Ответ 1

Оказывается, что parent/build.gradle следует перестроить следующим образом:

buildscript {
    ext {
        dependencyManagementPluginVersion = '0.5.3.RELEASE'
        springBootVersion = '1.3.0.RC1'
    }
    repositories {
        jcenter()
        maven { url "https://repo.spring.io/snapshot" }
        maven { url "https://repo.spring.io/milestone" }
    }
    dependencies {
        classpath("io.spring.gradle:dependency-management-plugin:${dependencyManagementPluginVersion}")
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

allprojects {
    group = "com.example"
    version '0.0.1-SNAPSHOT'

    apply plugin: 'java'
    apply plugin: 'eclipse'
    apply plugin: 'idea'
}

subprojects {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8

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

    dependencyManagement {
        imports {
            mavenBom("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")
//          mavenBom("org.springframework.boot:spring-boot-starter-parent:${springBootVersion}")
        }
    }
}

Проблема заключается в том, что блок buildscript для подпроектов действительно хорошо настроен, но... в неправильном месте. Этот блок subprojects относится к подпроектам, но он будет оцениваться в script, он был объявлен, и не было никаких зависимостей, объявленных для плагина, который он пытался применить.