Как разрешить циклическую зависимость в Gradle
Я переношу проект Java из Ant в Gradle. Я думаю, что лучшее решение-использовать поддержку нескольких проектов Gradle, но я не могу найти способ избавиться от циклической зависимости.
Первоначальный проект был настроен на такую компоновку:
- project/
- common/
- product-a/
- product-b/
Связь между common, product-a, и product-b это сложно. common зависит от product-a или product-b, в зависимости от файла конфигурации. Аналогично, product-a и product-b зависят от common, независимо от свойства конфигурации. product-a и product-b никогда не будут построены одновременно.
Я подумал, что быстрым решением будет использовать что-то вроде этого в project/build.gradle:
project(':product-a') {
dependencies {
compile project(':common')
}
}
project(':product-b') {
dependencies {
compile project(':common')
}
}
Затем я подумал о том, чтобы найти способ приблизить это к работе только для
product-a. Это привело меня к следующему: project(':common') {
dependencies {
compile project(':product-a')
}
}
Это вызовет исключение для циклической зависимости.
Я рассматривал рефакторинг product-a и product-b путем настройки интерфейсов классов, ожидаемых common и product-a/product-b или с помощью полиморфизм, но прежде чем я перейду к любому из них, есть ли лучший способ сделать это с помощью Gradle? Я еще не готов избавиться от этого технического долга.
1 ответ:
Удаление циклической зависимости не может быть разрешено с помощью хитрости сборки. Вам придется рефакторировать свои модули, чтобы больше не было циклической зависимости. Из ваших названий модулей и без какой-либо другой информации, я думаю, вы захотите извлечь часть "common", которая зависит от "product -*", и поместить ее в новый модуль.
Comments