Как работают некоторые gradle-зависимости без версии?

Насколько я знаю, gradle требует номер версии при настройке зависимостей, но разрешены частичные подстановочные знаки. Например, если я хочу гуаву, я не могу сделать это, так как она терпит неудачу:

compile('com.google.guava:guava')

Это должно быть (в качестве примера):

compile('com.google.guava:guava:21.0')

Тем не менее, я изучаю Spring, который имеет следующее:

compile("org.springframework.boot:spring-boot-starter")
compile("org.springframework:spring-web")
compile("com.fasterxml.jackson.core:jackson-databind")

Как эти зависимости работают без версии?

Это из-за следующего, но я думал, что эти строки требуются только для моего плагина 'org.springframework.boot':

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

3 ответа

Решение

Стоит отметить, что хитрость называется BOM (ведомость материалов), а фактические версии можно проверить в соответствующем файле POM внутри пакета spring-boot-dependencies. Это упоминается в официальной документации Spring Boot здесь: Build Systems.

Другой способ, которым Spring предоставляет это (для не загрузочных проектов), - это спецификация Spring Platform, где он фактически предоставляет версию для следующих зависимостей.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'io.spring.gradle:dependency-management-plugin:0.6.0.RELEASE'
    }
}

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

dependencyManagement {
    imports {
        mavenBom 'io.spring.platform:platform-bom:Athens-SR2'
    }
}

TL;DR - весенняя загрузка использует собственный преобразователь зависимостей.

Пружинный загрузочный плагин, который применяется со следующим фрагментом кода:

apply plugin: 'spring-boot'

обрабатывает зависимости, перечисленные без версии. Эта логика реализована в этом классе, который делегирует его здесь. DependencyManagementPluginFeatures применяются здесь.

Документация плагина весенней загрузки Gradle гласит следующее:

Объявленная вами версия подключаемого модуля spring-boot gradle определяет версию импортируемой бомбы spring-boot-starter-parent (это гарантирует, что сборки всегда будут повторяемыми). Вы всегда должны устанавливать версию подключаемого модуля Spring-Boot для фактической версии Spring Boot, которую вы хотите использовать.

Плагин Spring Boot Dependency Management не нужен.
Вы можете использовать встроенную поддержку Gradle BOM вместо плагина Spring Boot Dependency Management.

Например:

    plugins {
        id 'java'
        id 'org.springframework.boot' version '2.1.0.RELEASE'
    }
    repositories {
        jcenter()
    }
    dependencies {
        implementation platform('org.springframework.boot:spring-boot-dependencies:2.1.0.RELEASE')

    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    }

а для многомодульного проекта: в корневом build.gradle:

plugins {
    id 'java-library'
    id 'org.springframework.boot' version '2.1.0.RELEASE'
}


allprojects {
    apply plugin: 'java-library'

    repositories {
        jcenter()
    }
}

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

и в core/build.gradle

 dependencies {
    api platform('org.springframework.boot:spring-boot-dependencies:2.1.0.RELEASE')
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
Другие вопросы по тегам