Ответ 1
Отказ от ответственности: Я участвую в разработке JRebel, поэтому мой ответ может выглядеть немного предвзятым, но я сделаю все возможное, чтобы объяснить.
Чтобы ответить на этот вопрос, я прежде всего хочу обратить ваше внимание на то, что одним из основных различий между именами, которые вы указали, является: некоторые из решений требуют изменения дизайна приложения, а другие нет.
Решения для модуляции, такие как OSGi или Модули JBoss, обеспечивают преимущества, если вы будете следовать правильному пути и модулизировать свое приложение. В противном случае, если вы развертываете один комплект силоса, это в основном означает, что вы перезапускаете/перераспределяете все приложение, тем самым уменьшая любые преимущества, получаемые от этого подхода.
Play Framework представляет собой полнофункциональную инфраструктуру с возможностями "горячего развертывания". Эти возможности различаются в зависимости от версии используемой структуры. Но опять же, такая же история, как и с модулярностью - структура обеспечивает определенную модель программирования.
Apache Commons JCI на самом деле не является решением для горячего обновления кода. AFAIK, он просто компилирует и загружает класс через новый загрузчик классов. Это также связано с изменением кода приложения, как в случаях, упомянутых выше. Я не уверен, хорошо это или плохо. Недостатком является то, что вы вряд ли можете сделать какую-либо широкую интеграцию с экосистемой таким образом. Такой подход является вполне осуществимым для самодельной структуры, которая использовала бы эту функцию. Я бы предпочел использовать язык сценариев, например, Groovy, JRuby или JavaScript для достижения того же. Например, this, например.
JRebel, Fakereplace и DCEVM - эти ребята не заботятся о модели программирования. Но разница довольно большая:
DCEVM исправляет JVM, и его целью является предоставление полного решения hotswap, которое оно делает.
JRebel - это java-агент (подключенный с аргументом -javaagent VM), который обрабатывает код приложения и загружает новые версии классов путем их версии. Основное значение JRebel заключается в том, что он обеспечивает гибкую конфигурацию наряду с огромным объемом интеграции с каркасом, так что вы можете сделать намного больше, чем просто hotswap классов java. Например, добавьте и запустите autowire новый beans в контексте приложения Spring, добавьте новые EJB на лету, а также новые действия Struts и т.д.
Fakereplace также является инструментальным агентом, например JRebel, но он намного меньше поддерживает изменения кода Java (я полагаю), и число поддерживаемых фреймворков не является как впечатляет.
Feenix может делать столько, сколько позволяет API Java Instrumentation API. Что в основном означает, что на самом деле это не добавляет ценности поверх стандартного HotSwap JVM. То же самое для AgentSmith
ОБНОВЛЕНИЕ: этот ответ побудил автора Feenix придумать новую версию - Feenix 2.0, которая похожа на то, как JRebel работает с классами. Но, как говорит сам автор, Феникс все еще значительно уступает Джеребу. Существует также несколько аналогичных решений, таких как HotswapAgent и Spring Загруженные. Эти инструменты также предоставляют аналогичную функциональность, но ограничены по-своему.
Теперь немного по вашей конкретной проблеме, как это можно решить с помощью JRebel:
Каждый модуль приложения должен иметь свой собственный конфигурационный файл, rebel.xml. Под модулем мы подразумеваем либо EAR, WAR, либо любую из JAR-зависимостей в WEB-INF/lib (например, в вашем случае) или серверных библиотек. Файл конфигурации с указанием каталога, в котором скомпилированы классы, и JRebel будет загружать классы непосредственно из этого местоположения. Все это означает, что вы не должны собрать весь JAR после внесения изменений в класс Java. Вместо вы делаете изменения и компилируете исходный код (используйте IDE вместо сборки script). Скомпилированный класс будет перезагружен JRebel после вызова класса в коде приложения.