Рубрики
3. Инструментарий Java

DCE VM + HotSwap

Горячая замена.

Исходной предпосылкой было как-то упростить процесс разработки/отладки. В некоторых ситуациях, например когда запуск-перезапуск приложения или теста занимает продолжительное время, очень удобно пользоваться возможностью подправить логику работы уже запущенной программы.
В поисках решения наткнулся на довольно занятное решение — Dynamic Code Evolution VM. Данная виртуальная машина является результатом работ проведенных в рамках исследовательского проекта Институтом системного программного обеспечения им. Иоганна Кеплера в г. Линце (Австрия).

Если грубо описать полученный результат — это специальная «пропатченная» Java VM, которая позволяет на лету править классы в работающей машине. Главная плюшка — если обычно при дебаге вы можете «на горячую» менять содержимое метода, то в DCE VM можно еще и добавлять/удалять методы и поля в классе.

К сожалению с установкой DCE VM у меня не заладилось с самого начала. Инсталлятор не сработал, в итоге пришлось просидеть полночи в попытках заполучить эту чудную VM. К решению этой задачи пробовал подступиться с разных сторон. Пытался собрать исходники. Собирать пришлось из под cygwin-а (в очередной раз пожалел, что сейчас у меня рабочая операционка не Linux). Потом возникли сложности с установкой «Microsoft SDKs Windows v7.1», который почему-то не хотел устанавливаться. В итоге, правдам и неправдами, перед самым рассветом, перерыв кучу ссылок в интернете различными кривыми путями мне удалось стать счастливым обладателям этой машинки. Конечно сейчас, оглядываясь назад, у меня создается впечатление, что на самом деле я сделал кучу лишних шагов и про установку DCE VM информации более чем достаточно, главное внимательно читать инструкцию.

Мои эксперименты.

После того как всё настроил Hot Swap заработал сразу на:

  • Простых Java SE проектах.
  • Java Web проектах под Apache Tomcat.

Схема работы простая. Запускаем под дебагом → Делаем изменения → Жмем Apply Changes.

apply_code_changes

Если речь идёт о более экзотических случаях, например разработка Rich приложений на Netbeans Platform — то горячая замена у меня не заработала. Чуть позже у меня появилась гипотеза, что возможно это связано с тем, что у Netbeans Platform свой ClassLoader. Возможно гипотеза неверна и дело в настройках, думаю в свободное время посмотреть более внимательно исходники проекта и утилит, которые идут вместе с ним.