Как определить переменную для версии зависимостей в Gradle

В настоящее время я пытаюсь перенести проект Maven на Gradle

В моей версии Maven у меня есть версии зависимостей, все перечисленные в моем родительском pom:

<properties>
    <spring.version>4.2.3.RELEASE</spring.version>
    <spring.boot.version>1.3.3.RELEASE</spring.boot.version>
    ...
</properties>

И тогда я могу определить зависимость, подобную этой, в любом из моих подмодулей:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
</dependency>

Я пытаюсь сделать то же самое на Gradle, потому что некоторые из моих модулей обмениваются версиями зависимостей вроде этого, и я не хотел бы изменять более одного места, если я хочу обновить Spring, или сделать аналогичная операция.

Ближайший я получил к этому:

dependencies {
    ext.springVersion = '4.2.3.RELEASE'
    compile "org.springframework:spring-jdbc:$springVersion"
}

Но это все еще не работает. Каков рекомендуемый способ достижения этого в Gradle? Или Gradle относиться к этому по-другому? Возможно, мой разум все еще слишком много на Maven, чтобы увидеть другое решение.

Пожалуйста, имейте в виду, что эта попытка на Gradle не совсем то, что я хочу. Я хотел бы иметь возможность определять зависимости в отдельном файле, а не непосредственно в файле, который будет его использовать.

Ответ 1

То, как вы предоставили версию зависимости, является правильным и должно работать. IntelliJ Idea имеет некоторые проблемы с переменными в сценариях сборки gradle, поэтому вам не нужно полагаться на нее, просто попробуйте запустить сборку и проверить, загружена ли зависимость, и ваш проект построен правильно.

Если вы хотите сохранить зависимости проекта в отдельном файле, то наиболее распространенным подходом является определение их в корневом файле build.script через закрытие subprojects для всех подпроектов или через allprojects, если вы хотите указать зависимость для всех ваших проектов включает корень. Это будет выглядеть так:

subprojects{
    dependencies{
        compile ...
    }
}

Таким образом вы можете предоставить любую общую конфигурацию для подпроектов в корневой сборке script. Прочитайте об этом руководство пользователя

Или вы можете объявить переменную в корневой сборке script, инициализировать ее как карту со всеми необходимыми спецификациями зависимостей или как массив с одним списком зависимостей и использовать эту переменную в своих подпроектах, если они вам понадобятся. Что-то вроде этого в корне:

ext.commomLibs = [
  'testlibs' : 'junit:junit:4.8'
]

Примечание. Вы можете определить значение карты как массив спецификации lib, чтобы указать на все эти зависимости. И затем вы можете использовать его в своих подпроектах как:

dependencies{
    testCompile commomLibs.testlibs
}

Еще одна альтернатива - использовать отдельную сборку script с зависимостями и применить ее к buils script, который вам нужен, например

apply from: 'dependencies.script'

Затем вы можете поместить свои зависимости в зависимости script и просто применить его в любой другой сборке script, где вам нужны эти зависимости и/или может быть некоторой общей логикой.

Ответ 2

Ниже конфигурация в файле build.gradle у меня работала с gradle version 4.5, разместив ее здесь для дальнейшего использования -

ext {
    springVersion = '5.0.3.RELEASE'
}

dependencies {
    compile  "org.springframework:spring-context:$springVersion"
}

Ответ 3

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

buildscript {
    ext {
        springBootVersion = '2.0.4.RELEASE'
        hazelCastVersion = '3.10.4'
    }

    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")

    }
}

dependencies {
    compile('org.springframework.cloud:spring-cloud-starter-config')
    compile "com.hazelcast:hazelcast-spring:${hazelCastVersion}"
    compile group: 'com.hazelcast', name: 'hazelcast', version: "${hazelCastVersion}" }

Ответ 4

Добавляем к Викасу Сачдеву ответ:

Это не сработало для меня таким образом в моем подпроекте. Gradle выдает ошибку "Не удалось найти org.springframework: spring-context: $ springVersion". Наконец, я решил свою проблему, добавив знак плюс.

например:

root gradle.properties:

springVersion = '5.0.3.RELEASE'

root build.gradle

dependencies {
    compile  "org.springframework:spring-context:${springVersion}"
}

подпроект build.gradle

dependencies {
    compile  "org.springframework:spring-context:" + springVersion
}

Примечание: моя версия Gradle - 5.4.1.

или вы можете с помощью плагина управлять вашей зависимостью версии.

io.spring.dependency-менеджмент

Ссылки: https://docs.spring.io/dependency-management-plugin/docs/current/reference/html/

Ответ 5

У меня есть альтернативный синтаксис сахара. Я предполагаю, что это "длинный" способ написания зависимости.

мастер "gradle.build"

plugins {
    id 'java'
}


ext {
    slf4jApiVersion = '1.7.28'
    junitVersion = '4.12'
}

субмодуль/проект gradle.build

dependencies {
    testCompile group: 'junit', name: 'junit', version: "${junitVersion}"
    compile group: 'org.slf4j', name: 'slf4j-api', version: "${slf4jApiVersion}"
}

обратите внимание на разделение группы, имени и версии... SINQLE заключает в кавычки значения группы и имени, а DOUBLE заключает в кавычки переменную версии-значения.

Ответ 6

Теперь вы можете использовать еще более близко к зависимостям в App Gradle Build, как показано ниже:

dependencies {
    def daggerVersion = "2.24"
    implementation "com.google.dagger:dagger:$daggerVersion"
    annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
}