В общем случае невозможно создать циклические ссылки между проектами. И это вполне естественно. Предположим, что у вас есть проекты «A» и «B», которые являются взаимозависимыми. Это означает, что для компиляции «B» вы должны иметь «A», уже скомпилированный. Но для компиляции «A» вам нужно «B» для компиляции. Как вы нарушаете такой цикл?
Это, в некоторых частности футляры может быть возможен. Например, если в этих проектах нет циклов зависимостей между классами, то есть нет циклов зависимостей, таких как com.a.X -> com.b.Y -> com.b.Z -> com.a.X
, тогда может быть возможно скомпилировать оба проекта в кусках, пока оба они не будут полностью скомпилированы. Но для этого потребуются сложные алгоритмы и система отслеживания зависимостей, которые просто не стоят того.
Системы на основе плагинов обычно структурированы следующим образом. Основной проект разделяется на две части: фактическая программа и ее API-интерфейс плагина (фактическая программа зависит от этого API). Тогда есть плагины, которые зависят от API, но не от основной программы. Основная программа теперь может иметь зависимости от плагинов, потому что теперь нет циклов.
+------------------------+
| |
+-> Plugin 1 --+ Project
| | |
+-> Plugin 2 --+--+ V
| | +--> API
+-> Plugin 3 --+
Еще лучше связать программу с плагинами во время выполнения. Тогда нет никаких зависимостей во время компиляции Project
от плагинов. Система выполнения (например, OSGi или JBoss Modules или что-то пользовательское) становится ответственной за поиск и загрузку плагинов во время выполнения. Этот подход потребует некоторых изменений в системе сборки и способа запуска вашего проекта, но это может стоить того. Конечно, это зависит от ваших фактических потребностей.
Это просто делает проект проектом Scala, а проекты Scala могут включать файлы Java. –