Gradle: объявление версии доступа в плагине управления зависимостями весенней загрузки

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

Плагин «имитирует» поведение спецификации mavens, что означает, что он каким-то образом извлекает версии libs из родительского проекта maven (я не уверен, насколько точно это достигается, но обычно версии берутся из pom.xml). У него есть свойство jackson.version, которое используется для установки версий артефактов в группе com.fasterxml.jackson.dataformat.

В моем проекте используется артефакт из той же группы, однако он не включен в спецификацию (jackson-dataformat-yaml), но я хочу использовать ту же версию jackson.

Я попытался добавить зависимость компиляции следующим образом:

compile "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:${jackson.version}"

но сборка завершается с ошибкой:

Не удалось получить неизвестное свойство «Джексон» для объекта типа org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

Вопрос. Есть ли способ получить доступ к ресурсу? Или как еще я могу повторно использовать версию lib?

ОБНОВЛЕНИЕ Не знаю, почему я не попробовал это с самого начала, но это работает:

compile "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml"

Однако я понятия не имею, почему это работает (артефакт нигде не объявлен).


person Sasha Shpota    schedule 25.10.2017    source источник
comment
Пересматриваю свой ответ, чтобы ответить почему ваше обновленное решение работает ;-)   -  person Per Huss    schedule 31.10.2017


Ответы (3)


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

pom.xml, на который вы ссылаетесь, содержит зависимость

<dependency>
    <groupId>com.fasterxml.jackson</groupId>
    <artifactId>jackson-bom</artifactId>
    <version>${jackson.version}</version>
    <scope>import</scope>
    <type>pom</type>
</dependency>

... который ссылается на следующий pom.xml в проекте jackson-bom, который, в свою очередь, содержит следующую зависимость:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>${jackson.version.dataformat}</version>
</dependency>

... который, в свою очередь, указывает версию артефакта jackson-dataformat-yaml...

person Per Huss    schedule 30.10.2017
comment
Извините, мой вопрос немного ввел в заблуждение, я обновил описание. На самом деле родительский проект не является стандартным проектом gradle-parent. Функциональность, связанная с управлением зависимостями, достигается с помощью подключаемого модуля весенней загрузки, который импортирует версии, объявленные в спецификации maven. Обычно project.parent возвращает значение null. Вы можете найти такой конфиг при генерации проекта здесь start.spring.io - person Sasha Shpota; 31.10.2017

Однако я понятия не имею, почему это работает (артефакт нигде не объявлен).

Так что это проблема, что вы не используете какую-либо версию, но как она работает?

На самом деле Gradle использует некоторые правила. Они приведены ниже:

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

  2. С другой стороны, он будет использовать иерархию репозиториев первого или второго уровня для получения последней версии.

  3. Из документации Spring,

Управление зависимостями Maven включает в себя концепцию спецификации (бом). Бом — это особый вид pom, который используется для управления версиями зависимостей проекта и обеспечивает центральное место для определения и обновления этих версий.

Дополнительную информацию вы можете найти в этом руководстве: Gradle зависимости с файлами jar без номера версии

  1. spring-boot Также доступен -gradle-plugin, который предоставляет задачи для создания исполняемых файлов jar и запуска проектов из исходного кода. Он также предоставляет управление зависимостями, которое, помимо прочих возможностей, позволяет вам не указывать номер версии для любых зависимостей, которыми управляет Spring Boot:
plugins {
    id 'org.springframework.boot' version '1.5.8.RELEASE'
    id 'java'
}


repositories {
    jcenter()
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile("org.springframework.boot:spring-boot-starter-test")
}

Ссылка на ресурс:

  1. https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-build-systems.html

  2. Как некоторые зависимости Gradle работают без предоставленной версии

person SkyWalker    schedule 31.10.2017

Это происходит потому, что когда . (например, ${a.b}) используется в интерполяции строк в groovy, он обрабатывает предшествующее . как объект, у которого есть свойство, следующее за .. Таким образом, в ${a.b} объект a должен иметь свойство b, иначе он потерпит неудачу. В вашем примере jackson является экземпляром String и не имеет свойства версии. Чтобы решить эту проблему, вы можете использовать, например. jacksonVersion или Map. См. демонстрацию здесь.

person Opal    schedule 29.10.2017
comment
Спасибо за ответ. К сожалению, это не вариант. Прежде всего, я не контролирую родительский проект и ничего не могу там изменить. Во-вторых, это не стандартный родительский проект. На самом деле это проект maven, и плагин Spring-boot Gradle позволяет импортировать оттуда спецификацию (он берет версии из github.com/spring-projects/spring-boot/blob/1.5.x/). Вы можете создать такой проект Gradle на start.spring.io и проверить. - person Sasha Shpota; 30.10.2017
comment
@OleksandrShpota, извините, я чувствую, что могу что-то упустить. Не могли бы вы подготовить демонстрацию, воспроизводящую проблему? - person Opal; 30.10.2017