Hot Deploy

Jmix поддерживает технологию Hot Deploy, которая позволяет сразу применять изменения проекта к работающему приложению, без перезапуска сервера приложений.

Поддерживаемые классы и ресурсы

Следующие классы и ресурсы могут использоваться с hot deploy:

  • Дескрипторы и контроллеры экранов

  • Классы, используемые контроллерами экранов через создание экземпляров или статические методы. Примеры таких классов описаны в подразделе ниже.

  • Локализованные сообщения

  • Меню

  • Фетч-планы

  • Ресурсные роли

  • Роли уровня строк

Hot deploy не работает для классов сущностей и бинов Spring.

Как работает Hot Deploy

Hot Deploy работает следующим образом:

  • Studio обнаруживает измененные исходные файлы:

    • если измененный файл является файлом ресурсов, Studio копирует его в каталог .jmix/conf;

    • если измененный файл является файлом Java или Kotlin, Studio компилирует его и копирует в каталог build/classes проекта.

  • Когда приложение открывает экран, оно загружает новые классы и ресурсы из указанных выше каталогов.

Очистка каталога Hot Deploy

Расположение каталога ресурсов для hot deploy определяется свойством приложения jmix.core.conf-dir. Этот каталог может автоматически очищаться перед запуском приложения:

  • При запуске приложения из Jmix Studio конфигурация запуска может включать шаг Clean Hot Deploy Conf Directory в секции Before launch, настраиваемый в параметрах конфигурации Run/Debug. Если этот шаг включен, он удаляет каталог перед запуском.

  • При запуске через Gradle задача bootRun зависит от задачи cleanConf, поэтому запуск приложения с помощью bootRun также удаляет каталог перед запуском. Это поведение можно отключить в build.gradle:

    build.gradle
    jmix {
        // ...
        confDirCleanupEnabled = false
    }

Кроме того, Studio посылает приложению сигналы, чтобы оно очистило соответствующие кэши и загрузило измененные ресурсы. К ним относятся кэш локализованных сообщений, а также конфигурации фетч-планов, зарегистрированных экранов и меню. Сигналы реализованы в виде триггер-файлов, создаваемых в каталоге .jmix/temp/triggers. Расположение этого каталога можно изменить с помощью свойства jmix.core.temp-dir.

Примеры классов с hot deploy

Вот несколько практических примеров классов, которые участвуют в hot deploy при использовании контроллерами экранов. Обратите внимание, что это лишь несколько распространенных случаев; другие классы, соответствующие критериям (инстанцируемые в контроллере экрана или вызываемые через статические методы), также будут участвовать в hot deploy.

Пользовательские UI-компоненты

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

Пример такого компонента можно найти в разделе Использование Element API.

Вспомогательные классы со статическими методами

Вспомогательные классы, содержащие статические методы, задействуются при hot deploy, когда вызываются из контроллеров экранов.

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class DateUtils {
    public static String formatDate(LocalDate date) {
        return date.format(DateTimeFormatter.ofPattern("dd.MM.yyyy"));
    }

    private DateUtils(){
    }
}

В контроллере экрана:

@ViewComponent
private TypedTextField<String> textField;

@Subscribe
public void onInit(final InitEvent event) {
    String formattedDate = DateUtils.formatDate(LocalDate.now());
    textField.setValue(formattedDate);
}

Классы описания значений для диаграмм

Например, классы, которые подготавливают или преобразуют данные для диаграмм, развертываются при hot deploy.

Примером такого класса является ValueDescription в UI Samples.

Индикатор hot deploy

В Studio в правом верхнем углу файлов, поддерживающих hot deploy, отображается значок индикатора статуса. Этот значок, который виден на файлах, таких как контроллеры экранов, дескрипторы экранов, пакеты сообщений, роли и другие подобные ресурсы, позволяет мгновенно оценить текущий статус hot deploy для конкретного файла.

Основная задача этого индикатора - непрерывно информировать разработчиков о передаче последних изменений исходного кода в работающее приложение. Вид значка изменяется, чтобы отражать успешность развертывания изменений, процесс развертывания или возникновение ошибок в процессе развертывания, предоставляя немедленную визуальную обратную связь о состоянии hot deploy.

Рассмотрим различные состояния индикатора hot deploy.

  1. Приложение не запущено:

    hot deploy ind 1

    Индикатор имеет серые границы. При нажатии на индикатор появляется всплывающее сообщение с предложением запустить приложение.

  2. Приложение запущено, изменения в файле отсутствуют:

    hot deploy ind 2

    Индикатор имеет зеленые границы. При нажатии на индикатор появляется всплывающее сообщение, указывающее, что hot deploy для файла еще не выполнялся.

  3. Файл изменен, hot deploy доступен: Индикатор становится полностью зеленым. При нажатии на индикатор появляется всплывающее сообщение с предложением запустить hot deploy.

    hot deploy ind 3

    После запуска hot deploy индикатор остается полностью зеленым, а во всплывающем сообщении отображается время последнего hot deploy:

    hot deploy ind 4
    Приложению может потребоваться 2-3 секунды, чтобы перезагрузить классы и ресурсы. Если вы не видите ожидаемых изменений в приложении, попробуйте еще раз обновить страницу браузера.
  4. Hot deploy не удался: Индикатор становится красным, указывая на то, что hot deploy не удался из-за ошибки компиляции или другой проблемы.

    hot deploy ind 5

Устранение неполадок

В некоторых случаях, например, для нестандартных конфигураций многомодульных проектов, Jmix Studio может не определить путь к выходным данным компилятора модуля. Это влияет на hot deploy, поскольку Studio не может правильно разрешить classpath, необходимый для процесса компиляции при hot deploy.

Если вы столкнулись с этой проблемой, вы можете вручную указать путь к выходным данным компилятора модуля, используя специальное свойство в вашем скрипте build.gradle:

ext.jmixCompilerOutputPath = "build/classes/java/main"

Путь должен быть указан относительно папки, содержащей скрипт сборки. Jmix Studio разрешит это значение во время синхронизации Gradle и будет использовать его в classpath процесса компиляции при hot deploy.