Hot Deploy
Jmix поддерживает технологию Hot Deploy, которая позволяет отображать сделанные в проекте изменения в работающем приложении без необходимости перезапускать сервер.
Hot deploy работает для следующих классов и ресурсов:
-
Дескрипторы и контроллеры экранов
-
Классы, используемые контроллерами экранов через создание экземпляров или статические методы. Примеры таких классов описаны в подразделе ниже.
-
Локализованные сообщения
-
Меню
-
Фетч-планы
-
Ресурсные роли
-
Роли уровня строк
Hot deploy не работает для классов сущностей и бинов Spring.
Принцип работы Hot deploy следующий:
-
Studio обнаруживает измененные файлы и
-
если это файл ресурсов, Studio копирует его в каталог
.jmix/conf; -
если это файл Java или Kotlin, Studio компилирует его и копирует файл класса в каталог
build/classesпроекта.
-
-
Когда приложение открывает экран, фреймворк загружает новые классы и ресурсы из каталогов перечисленных выше.
Расположение каталога hot deploy ресурсов определяется свойством приложения jmix.core.conf-dir. Этот каталог очищается при запуске приложения действием Before launch, заданным в параметрах конфигурации Run/Debug.
Кроме того, чтобы обеспечить более надежную очистку, не зависящую от Studio, предусмотрена Gradle задача под названием cleanConf. Эта задача выполняется каждый раз перед запуском приложения с помощью задачи bootRun.
Если у вас возникнут какие-либо проблемы с этой функцией, вы можете отключить задачу cleanConf в вашем проекте, добавив следующее свойство в файл build.gradle:
jmix {
// ...
confDirCleanupEnabled = false
}
Кроме того, Studio посылает приложению специальные сигналы, для того чтобы заставить его очистить кэши и перезагрузить измененные ресурсы. Это кэш локализованных сообщений и конфигурации представлений, зарегистрированных экранов и меню. Сигналы реализованы с помощью триггер-файлов, создаваемых в каталоге .jmix/temp/triggers (расположение может быть изменено с помощью свойства jmix.core.temp-dir).
| После сохранения изменений в Studio может потребоваться 2-3 секунды для того, чтобы приложение перезагрузило ресурсы и классы. Если после открытия экрана вы не увидели ожидаемых изменений, попробуйте обновить страницу браузера еще раз. |
Примеры классов с 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.
-
Приложение не запущено:
Индикатор имеет серые границы. При нажатии на индикатор появляется всплывающее сообщение с предложением запустить приложение.
-
Приложение запущено, изменения в файле отсутствуют:
Индикатор имеет зеленые границы. При нажатии на индикатор появляется всплывающее сообщение, указывающее, что hot deploy для файла еще не выполнялся.
-
Файл изменен, hot deploy доступен: Индикатор становится полностью зеленым. При нажатии на индикатор появляется всплывающее сообщение с предложением запустить hot deploy.
После запуска hot deploy индикатор остается полностью зеленым, а во всплывающем сообщении отображается время последнего hot deploy:
-
Hot deploy не удался: Индикатор становится красным, указывая на то, что hot deploy не удался из-за ошибки компиляции или другой проблемы.
Устранение неполадок
В некоторых случаях, например, для нестандартных конфигураций многомодульных проектов, Jmix Studio может не определить путь к выходным данным компилятора модуля. Это влияет на hot deploy, поскольку Studio не может правильно разрешить classpath, необходимый для процесса компиляции при hot deploy.
Если вы столкнулись с этой проблемой, вы можете вручную указать путь к выходным данным компилятора модуля, используя специальное свойство в вашем скрипте build.gradle:
ext.jmixCompilerOutputPath = "build/classes/java/main"
Путь должен быть указан относительно папки, содержащей скрипт сборки. Jmix Studio разрешит это значение во время синхронизации Gradle и будет использовать его в classpath процесса компиляции при hot deploy.