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

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

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

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

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

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

но сборка не удалась с:

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

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

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

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

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

3 ответа

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

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

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

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

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

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

Управление зависимостями Maven включает концепцию ведомости материалов (bom). Bom - это особый вид 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-зависимости без версии?

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

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...

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

Другие вопросы по тегам