Разрешить круговую зависимость в Gradle - PullRequest
0 голосов
/ 01 октября 2019

Я недавно начал разработку Java-проекта, в котором есть несколько подпроектов. Все они gradle. Допустим, есть два проекта A и B, которые уже реализованы. И я собираюсь представить еще один отличный проект C. И зависимости такие:

  • A имеет зависимости от B
  • B имеет зависимости от C
  • C имеет зависимости от A

Так что мне нужно реализовать этот проект C без ошибки циклических зависимостей, как это было, когда я пытался построить проект с Gradle. Я видел несколько ответов, что интерфейс является решением для этого. Но в моем случае проекты A и B - это большие проекты, и я не могу придумать, как создать для них Интерфейс. Единственное, что я могу сделать, это ввести интерфейсы для проекта С. Так есть ли способ решить мою проблему с этими случаями? Если нет, то какой способ иметь такой? И, пожалуйста, обратите внимание, что эти проекты A, B, C являются отдельными проектами, поэтому они не могут объединяться в один.

1 Ответ

1 голос
/ 01 октября 2019

Предисловие

Нет волшебства, которое позволило бы вам скомпилировать ваш проект, когда в вашем графике зависимостей есть цикл. Вам потребуется выполнить некоторый рефакторинг, чтобы исключить цикл.

То, как вы работаете с циклическими зависимостями, разбивает модули на более мелкие и повторяет это до тех пор, пока вы не удалите цикл.

Алгоритм

1) Начните с извлечения частей A, которые используются C, в отдельный модуль (назовем его D):

A -> B -> C
|         |
|         |
 --> D <--

Если D не зависит от какого-либо другого модуля, который выготовоЕсли это так, вам нужно продолжить расщепление.

2) Скажем, D stil зависит от B:

A -> B -> C
|    ^    |
|    |    |
 --> D <--

Вам необходимо аналогичным образом извлечь общие части из B (назовем это E):

A -> B -> C
|    |    |
|    v    |
|    E    |
|    ^    |
|    |    |
 --> D <--

Еще раз, если у E нет зависимостей, вызывающих цикл - все готово. Если нет - продолжайте.

3) Скажем, E зависит от C:

A -> B -> C --
|    |    ^   |
|    v    |   |
|    E ---    |
|    ^        |
|    |        |
 --> D <------

Что мы будем делать? Разделение Обвиулси C (выдержка F):

A -> B -> C --
|    |    |   |
|    v    v   |
|    E -> F   |
|    ^        |
|    |        |
 --> D <------

Послесловие

Обратите внимание, что это может быть не так просто, если вообще возможно (в пределах разумного количества времени и / или бюджета).

Вы можете также подумать о дублировании кода в A, на который опирается C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...