November 8, 2022

Hot Swap- как менять source код в Inteleji IDE в debug session без перезапуска проекта

Когда мы разрабатываем код древнего монолита и дебажим его локально в формате задеплоеного war на локальный tomcat через inteleji idea - каждое изменение кода требует перезапуска приложения для применения изменений.

На одном из проектов я столкнулся с тем что локальный стартап приложения занимает 6 минут.Все дальнейшие эксперименты и попытки проходили на подыпытном вида - jdk1.8.0_181 and gradle multi module project build and deployed as single war on Tomcat 8.5.68.

Spring на проекте есть но не spring boot -следовательно spring boot dev tools отпадает.

Шаг 1 - пытаемся в Hot Swap в Inteleji Idea Ultimate 2022

Первым шагом было знакомство с встроенными иснтрументами IDE для того чтобы попытаться в динамике поменять java class source code state in jvm - такая процедура определяется термином Hot Swap .

Ветераны индустрии помнят такой иструмент как Jrebel - но нас сейчас он не интересует так как Jrebel на момент сентября 2022 года не работает в России.

Inteleji предоставляет такую возможность : https://www.jetbrains.com/help/idea/altering-the-program-s-execution-flow.html#reload_classes

Но работает это судя по всему только в hello world приложениях не зависящих от таких фреймворков как spring и hibernate.При моей попытке через Inteleji Hot-Swap-нуть код класса аннотированного @Service в монолите на базе java 8 я словил такой exception

Отгуглить как решать такой кейс базовыми инструментами Inteleji Ultimate я не смог.

Шаг 2 - DCEVM

Hot Swap в Inteleji существует с некоторыми ограничениями

Due to VM design, HotSwap has the following limitations:

  • it is only available if a method body is modified. Changing signatures is not supported.
  • adding and removing class members is not supported
  • if the modified method is already in the call stack, the changes will take effect only after the program exits the modified method. Until that moment, the method body remains unchanged, and the frame is marked as obsolete.

If you want to remove the limitations imposed by the standard VM, you can use the Dynamic Code Evolution VM with unlimited support for reloading classes at runtime.

Ну DCEVM так DCEVM подумал я и пошел искать.

Есть 2 варианта настройки :


1 вариант - наиболее понятный https://ssledz.github.io/blog/2016/05/16/hot-swap-in-java-with-dcevm-and-hotswapagent-a-jrebel-free-alternative/ - у меня не сработал - пробовал с liberica jdk и oracle jdk 8 - летели ошибки HOT Swap в IDE


2 вариант - официальный гайд - http://hotswapagent.org/ - пробовал только для java 8 с установкой всех инструментов из гайда + oracle jdk 181 - тоже не сработало - летели ошибки HOT Swap в IDE :

hotswap-agent-1.4.2-SNAPSHOT
DCEVM-8u181-installer-build2

Шаг 3 Single Hot Swap inteleji plugin

Потратив день на безрезультатные эксперименты в рамках предыдущих 2 шагов и заведя тикет https://github.com/HotswapProjects/HotswapAgent/issues/446

Случайно был найден плагин :

https://plugins.jetbrains.com/plugin/14832-single-hotswap

Он как раз и дал эффективный результат без всяких настроек JVM с помощью флажков указанных в run/debug configuraton IDE для tomcat,возни с hotswap agent ,и DCEVM инсталятором .

Я просто поставил плагин и Hot Swap заработал для - liberica jdk 1.8 and gradle multi module project build and deployed as single war on Tomcat 8.5.68 .

После подключения в ide появляется такой значок :

Для Hot Swap IDE у меня стояла такая настройка :

В итоге запустив debug сессию в IDE - я смог коментить код/менять код в inteleji ide code space и hot swap-ить его на ходу без перезапуска проекта =)