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 подумал я и пошел искать.
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 у меня стояла такая настройка :