Я использую 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 также исправляет проблему, так как она больше не зависит от библиотеки. Общий вопрос остается в силе, однако.