Переходные зависимости подключаемых модулей Gradle, мешающие и нарушающие сборку - PullRequest
0 голосов
/ 17 марта 2020

Я использую Gradle 6.1 в многомодульном проекте. Я также использую два плагина: kotlin("jvm") и id("com.google.cloud.tools.jib"), и они загружаются в следующие модули:

root/
 build.gradle.kts loads kotlin("jvm")
 services/
   my-service/
     rest/
       build.gradle.kts loads id("com.google.cloud.tools.jib")

(Есть больше модулей, файлов и т. Д. c., Но это соответствующие из них.)

Сбой сборки:

$ ./gradlew clean jibDockerBuild
...
* What went wrong:
Execution failed for task ':services:driver:rest:jibDockerBuild'.
> com.google.cloud.tools.jib.plugins.common.BuildStepsExecutionException: 'org.apache.http.client.config.RequestConfig$Builder     
org.apache.http.client.config.RequestConfig$Builder.setNormalizeUri(boolean)'

Я обнаружил проблему: плагины Kotlin и JIB имеют транзитивную зависимость от org.apache.httpcomponents:httpclient: Kotlin требует 4.5. 3 и JIB 4.5.10. Проблема в том, что в этом проекте загружается только 4.5.3, и JIB не работает, поскольку новый метод недоступен. Это можно проверить с помощью ./gradlew buildEnv.

Я нашел обходной путь, мне нужно загрузить оба плагина на уровне root (какой из них сначала кажется неактуальным) в основном файле Gradle; теперь ./gradlew buildEnv показывает, что используется версия с более высокой зависимостью, также для Kotlin (вывод сокращен и неполон):

classpath
+--- org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.3.61
|    \--- org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.61
|         +--- de.undercouch:gradle-download-task:3.4.3
|         |    \--- org.apache.httpcomponents:httpclient:4.5.3 -> 4.5.10

В этом случае это работает, но может случиться так, что новая версия библиотеки сломается Kotlin плагин. Проблема в том, что плагины и их зависимости находятся на пути к классам без разделения, что было нормальным в Java до Jigsaw et c. Есть ли способ для Gradle разделить зависимости, чтобы каждый плагин использовал именно ту версию, которую он объявил? Я строю на Java 11, чтобы можно было использовать систему модулей, но есть ли у Gradle возможность включить ее?

EDIT : обновление до Kotlin 1.3.70 также исправляет проблему, так как она больше не зависит от библиотеки. Общий вопрос остается в силе, однако.

1 Ответ

1 голос
/ 17 марта 2020

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

Нет.

Все плагины имеют одинаковую конфигурацию сценария сборки: classpath

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

buildscript {
    configurations {
        classpath {
            resolutionStrategy {
                force("org.apache.httpcomponents:httpclient:4.5.10")
            }
        }
    }
}

Это всего лишь один из многих способов управления разрешением зависимости для сценария сборки. зависимостей. Вы также можете использовать платформу для консультирования по версиям зависимостей:

buildscript {
    dependencies {
        classpath(enforcedPlatform("org.springframework.boot:spring-boot-dependencies:2.2.5.RELEASE"))
    }
}

Для получения дополнительной информации обратитесь к документации:

...