4.5.4. Использование компонентов приложения

Как упоминалось в разделе Компоненты приложения, любое CUBA-приложение может быть компонентом другого приложения. Компонент приложения представляет собой по сути full-stack библиотеку, предоставляющую функциональность на всех уровнях - от схемы БД до бизнес-логики и UI.

В данном разделе рассматривается пример создания компонента приложения и использования его в проекте. Компонент будет предоставлять функциональность "Customer Management" и содержать сущность Customer и соответствующие экраны UI. Приложение будет использовать сущность Customer из компонента в качестве ссылки в собственной сущности Order.

app components sample
Создание компонента Customer Management
  1. Создайте новый проект в Studio и укажите следующие значения в окне New project:

    • Project name - customers

    • Project namespace - cust

    • Root package - com.company.customers

  2. Откройте Project properties на редактирование и на вкладке Advanced установите значение поля Module prefix в cust. Это необходимо для того, чтобы имена артефактов компонента имели префикс, отличный от app, принятого по умолчанию.

  3. Создайте сущность Customer с атрибутом name. Переключитесь на вкладку Instance name и укажите name в атрибутах name pattern.

    Warning

    Если компонент содержит персистентные классы, аннотированные @MappedSuperclass, убедитесь, что в этом же проекте есть их наследники, являющиеся сущностями (т.е. аннотированные @Entity). В противном случае байткод таких базовых классов не будет необходимым образом модифицирован и они не будут правильно работать в приложениях, использующих компонент.

  4. Сгенерируйте скрипты БД и создайте стандартные экраны для сущности Customer: cust$Customer.browse и cust$Customer.edit. После этого откройте дизайнер меню и переименуйте пункт application в customerManagement.

  5. Нажмите на ссылку App component descriptor на панели Project properties. Сохраните сгенерированный описатель компонента нажав OK.

  6. Проверьте функциональность Customer Management: Run > Create database, Run > Start application server, затем откройте http://localhost:8080/cust в веб-браузере.

  7. Установите компонент приложения в локальный Maven-репозиторий, выполнив команду главного меню Run > Install app component. Данная команда просто запускает задачу Gradle install после остановки демонов Gradle.

Создание приложения Sales
  1. Создайте новый проект в Studio и укажите следующие значения в окне New project:

    • Project name - sales

    • Project namespace - sales

    • Root package - com.company.sales

  2. Откройте Project properties на редактирование и на панели App components нажмите на кнопку добавления Custom components. В диалоге Custom application component выберите проект customers в списке Registered project. Данный список содержит все проекты, зарегистрированные в Studio и имеющие описатель app-component.xml. Нажмите в диалоге OK. В списке кастомных компонентов проекта появятся Maven-координаты компонента Customer Management. Сохраните страницу свойств проекта нажатием OK.

  3. Создайте сущность Order с атрибутами date и amount. Добавьте атрибут customer в виде many-to-one ассоциации с сущностью Customer - она должна быть доступна в выпадающем списке Type.

  4. Сгенерируйте скрипты БД и создайте стандартные экраны для сущности Order. При создании экранов создайте представление order-with-customer-view, включающее атрибут customer и используйте его в экранах.

  5. Проверьте функциональность приложения: Run > Create database, Run > Start application server, затем откройте http://localhost:8080/app в веб-браузере. Приложение должно содержать два пункта меню верхнего уровня: Customer Management и Application.

Модификация компонента Customer Management

Предположим, что необходимо изменить функциональность компонента (добавить атрибут в сущность Customer) и пересобрать приложение для внесения этих изменений.

  1. Откройте проект customers в Studio.

  2. Откройте сущность Customer на редактирование и добавьте атрибут address. При сохранении изменений выберите экраны браузера и редактора для включения нового атрибута.

  3. Сгенерируйте скрипты БД - будет создано новый скрипт обновления с изменением таблицы. Сохраните скрипты.

  4. Проверьте изменения в компоненте: Run > Update database, Run > Start application server, затем откройте http://localhost:8080/cust в веб-браузере.

  5. Переинсталлируйте компонент в локальный Maven-репозиторий выполнив команду меню Run > Install app component.

  6. Закройте проект sales в Studio (если он открыт) и откройте его снова. Это необходимо для того, чтобы Studio загрузила новые исходники компонента.

  7. Выполните команды меню Build > Clean, затем Build > Assemble project.

  8. Запустите Run > Update database - будет выполнен скрипт обновления из компонента Customer Management.

  9. Выполните Run > Start application server и откройте http://localhost:8080/app в веб-браузере - приложение теперь содержит сущность Customer и соответствующие экраны с атрибутом address.

Предоставление общего доступа к компоненту Customer Management

Компонент приложения можно выгрузить в удаленный Maven-репозиторий.

  1. Остановите сервер Studio.

  2. Установите репозиторий как описано в разделе Установка приватного репозитория артефактов.

  3. Откройте build.gradle проекта customers в текстовом редакторе. Замените репозиторий и имя/пароль пользователя в секции buildscript/repositories и добавьте uploadRepository в секции cuba:

    buildscript {
        ...
        repositories {
            maven {
                url 'http://repo.company.com/nexus/content/groups/work' // repository containing CUBA and your own artifacts
                credentials {
                    username(rootProject.hasProperty('repoUser') ? rootProject['repoUser'] : 'admin')
                    password(rootProject.hasProperty('repoPass') ? rootProject['repoPass'] : 'admin123')
                }
            }
    ...
    cuba {
        ...
        uploadRepository {
            url = 'http://repo.company.com/nexus/content/repositories/snapshots' // repository for uploading your artifacts
            user = 'admin'
            password = 'admin123'
        }
    }
  4. Откройте командную строку в корневом каталоге проекта customers и выполните gradle assemble. Это необходимо для того, чтобы новый репозиторий закэшировал артефакты CUBA, требуемые для работы Studio.

  5. В окне сервера Studio укажите ваш репозиторий и имя/пароль для доступа к нему вместо стандартного репозитория CUBA. Запустите сервер Studio.

  6. Откройте проект customers в Studio.

  7. Найдите в диалоге Search (Alt-/) задачу Gradle uploadArchives и запустите ее. Эту задачу можно запускать и из командной строки. Артефакты компонента Customer Management будет выгружены в ваш репозиторий.

  8. Удалите артефакты компонента из локального Maven-репозитория чтобы быть уверенным, что они загрузятся из удаленного репозитория при последующей сборке приложения sales: просто удалите каталог .m2/repository/com/company, находящийся в домашнем каталоге пользователя.

  9. Откройте проект customers в Studio. Адрес репозитория в build.gradle будет автоматически заменен на тот, который указан в окне сервера Studio.

  10. Теперь можно собрать и запустить приложение - компонент Customer Management будет загружен из удаленного репозитория.