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

Исходной предпосылкой было как-то упростить процесс разработки/отладки. В некоторых ситуациях, например когда запуск-перезапуск приложения или теста занимает продолжительное время, очень удобно пользоваться возможностью подправить логику работы уже запущенной программы.
В поисках решения наткнулся на довольно занятное решение - 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. Возможно гипотеза неверна и дело в настройках, думаю в свободное время посмотреть более внимательно исходники проекта и утилит, которые идут вместе с ним.

Не возьмусь сравнивать концептуальные отличия между DCE VM и jRebel, хотя на мой взгляд с прикладной точки зрения конечного пользователя-программиста они работают приблизительно одинаково. Существенное отличие jRebel думаю в том, что за него нужно каждый год платить по $365 (около 13 300 рублей). Поэтому не считаю правильным сравнивать коммерческое ПО и бесплатное, с точки зрения сервиса оценка думаю пока не в пользу последнего. Дело в том, что какой-либо информации и документации по jRebel мне показалось раз в 10 больше, чем по DCE VM. Откровенно говоря, обилие информации и количество промо-материалов по jRebel просто поражает, думаю большинство статей в интернете про горячую замену в java содержит упоминание этого коммерческого продукта.