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

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

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

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

Чтобы файлы Gradle оставались СУХИМИ, я распаковал сценарии общих модулей в 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}")
        }
    }
}

альфа build.gradle

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

бета-версия 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 Boot версии 1.3.0.RC1

person matsev    schedule 14.11.2015    source источник
comment
Если мой ответ был полезен, проголосуйте за него.   -  person Opal    schedule 17.11.2015
comment
@Opal Извините за задержку, я думал, что принял ваш ответ. Я написал сообщение в блоге, касающееся по делу, пожалуйста, проверьте подтверждения. :-)   -  person matsev    schedule 23.11.2015
comment
Спасибо, это именно та проблема, которая у меня была --- чтобы помочь другим решить эту проблему в Google, я добавлю: Если вы наивно попробуете: примените плагин 'spring -boot' ко ВСЕМ своим подпроектам (только для того, чтобы получить управление зависимостями Spring бесплатно ) вы получите ошибку сборки (по крайней мере, я попал под Windows), например: Выполнение не выполнено для задачи ': xxxxx: bootRepackage'. Невозможно переименовать xxxxx.jar в xxxxx.jar.original   -  person Rop    schedule 03.03.2016
comment
@matsev, только что заметил инфу по статье - выглядит неплохо. Спасибо, что вас упомянули!   -  person Opal    schedule 18.03.2016


Ответы (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 блок относится к подпроектам, но он будет оцениваться в сценарии, который был объявлен, и не было объявлено никаких зависимостей для подключаемого модуля, который он пытался применить.

person Opal    schedule 14.11.2015
comment
Спасибо, но это не совсем так. Теперь Gradle не может найти репозитории для подмодулей: > Cannot resolve external dependency org.springframework.boot:spring-boot-dependencies:1.3.0.RC1 because no repositories are defined. Required by: com.example:alpha:0.0.1-SNAPSHOT Копирование repositories в allprojects решает проблему, но есть ли способ определить repositories один раз, чтобы он был доступен как из buildscript, так и из allprojects? - person matsev; 15.11.2015
comment
Нет: / К сожалению, это отдельные конфигурации. Его нужно продублировать. - person Opal; 15.11.2015
comment
К вашему сведению, buildscript относится к build.gradle, а не к какому-либо конкретному проекту в нем, поэтому то, что вы нашли, не удивительно. Но ваш ответ не соответствует тому, что показано в вашем вопросе; в корневом проекте больше нет dependencyManagement. - person Abhijit Sarkar; 28.11.2018