Композитные проекты

Композитный проект в Jmix представляет собой структуру проекта, которая объединяет несколько связанных дополнений и приложений в единый проект IDE, даже если они находятся в разных репозиториях исходного кода.

Создание композитного проекта

Чтобы создать пустой композитный проект, запустите мастер создания проекта и выберите шаблон Composite Project. Studio создаст проект со следующей структурой (для примера взято имя проекта sales):

root-dir/
    sales-all/
        build.gradle
        settings.gradle

Затем вы можете добавить подпроекты, создав новые дополнения или приложения, выбрав существующий проект из системы контроля версий (VCS) или просто добавив существующую папку с проектом. Используйте действия New → Subproject в окне инструментов Jmix:

new subprojects

Мы рекомендуем размещать подпроекты внутри корневого каталога рядом с проектом-агрегатором <project-name>-all.

Studio отображает композитный проект и все подпроекты в виде узлов верхнего уровня в Окне инструментов Jmix:

composite projects structure

Как вы можете видеть, файл settings.gradle проекта-агрегатора использует инструкции includeBuild. Эти инструкции используют функцию composite build Gradle, которая помогает эффективно структурировать проекты.

В композитном билде Gradle заменяет зависимости от артефактов прямыми зависимостями между подпроектами. Это означает, что изменения, внесенные в дополнение, немедленно влияют на зависимые дополнения и приложение. IntelliJ IDEA идеально импортирует такой проект, распознавая зависимости, определенные Gradle. В результате вы получаете структуру композитного проекта, которая обеспечивает прозрачный рефакторинг и устраняет необходимость в подходе "publish locally".

Открытие композитного проекта

При открытии композитного проекта, убедитесь, что вы перешли в директорию проекта-агрегатора <project-name>-all и открыли файл build.gradle в этой директории:

open composite project

Управление свойствами

Вы можете редактировать общие свойства всех подпроектов. Нажмите Settings → Project Properties на панели инструментов Окна инструментов Jmix. Выберите All subprojects, когда Studio спросит вас, какой проект нужно отредактировать:

composite project edit properties

Общие свойства включают в себя настройки репозитория артефактов и версию фреймворка Jmix. Таким образом, вы можете сразу обновить все подпроекты до более новой версии Jmix.

Настройка зависимостей

Самая полезная функция для больших композитных проектов - это возможность настраивать зависимости между подпроектами в простом диалоговом окне.

Вы можете открыть его с помощью действия Settings → Dependencies Between Subprojects в окне инструментов Jmix.

composite project dependencies

Здесь customers - это дополнение, которое зависит от дополнения users. В соответствии с изменениями, которые вы вносите в этом диалоге, Studio добавляет зависимости от артефактов в файлы build.gradle подпроектов, а также настраивает аннотации @JmixModule дополнений. Studio также предотвращает появление циклических зависимостей. На скриншоте ниже вы можете видеть, что диалог не позволяет сделать дополнение users зависимым от customers, потому что customers уже зависит от users:

composite project dependencies 2

Управление хранилищами данных

Studio может генерировать файлы Liquibase changelog в дополнениях, в том числе при работе с ними в композитных проектах.

Чтобы сгенерировать файл changelog, в дополнении нужно определить хранилище данных. Оно будет отображено в дереве Jmix:

add on data store

Настройки хранилища будут сохранены в файле jmix-studio.xml вместо конфигурации Java.

Теперь в хранилище данных можно выполнить действие Generate Liquibase Changelog.

В композитном проекте необходимо снова указать хранилище данных для того же дополнения, поскольку композитный проект имеет свой собственный файл jmix-studio.xml, расположенный в проекте-агрегаторе <project-name>-all. Таким образом, настройки хранилища данных при работе над дополнением в отдельном и композитном проектах будут храниться отдельно, но набор сгенерированных changelogs будут одинаковыми.