Каковы различия между различными плагинами Java для горячей перезагрузки классов и какой из них наиболее интуитивно понятен?

В настоящее время я пытаюсь реализовать горячую перезагрузку класса в приложении Java, однако существует так много плагинов на выбор, и я не могу найти хорошее сравнение между вариантами. Кроме того, на веб-сайтах плагинов не совсем понятно, что такое точные функции и как их использовать.

Существует также возможность создать собственный горячий класс, перезагружающий ClassLoader, но я чувствую, что это похоже на «изобретение велосипеда», если уже есть так много плагинов, которые могут делать работу .. другие люди согласны с этим?

Плагины Java, которые я нашел, которые, я думаю, могут выполнить эту работу:

Итак, кто-нибудь знает, в чем различия между плагинами? А также какой плагин является наиболее интуитивно понятным в использовании?

В качестве примечания: на самом деле я хочу перезагрузить зависимость .jar-файла моего java-приложения. У меня есть код Java, который очень часто автоматически перекомпилируется, а затем преобразуется в файл .jar. Это зависимость моего java-приложения, и моему приложению необходимо каждый раз использовать самую новую версию этого .jar-файла.


person PJvG    schedule 02.07.2013    source источник
comment
Вы можете изучить использование OSGI. Он поддерживает перезагрузку пакетов во время выполнения.   -  person Viktor Seifert    schedule 02.07.2013
comment
Я использовал Jrebel и был поражен тем, насколько хорошо он перезагружает классы в проектах и ​​их зависимости. Бесплатная социальная лицензия упрощает тестирование. JRebel имеет довольно обширную базу пользователей.   -  person vcetinick    schedule 02.07.2013
comment
Спасибо за ваши комментарии. Я уже изучаю OSGi и JRebel, но еще не решил, какой из них лучше для меня. Кроме того, я добавлю OSGi в список выше.   -  person PJvG    schedule 02.07.2013
comment
@PJvG Можете ли вы поделиться своими выводами? Что вы выбрали и каковы были ваши выводы?   -  person Martin Kersten    schedule 02.10.2015
comment
@MartinKersten Я решил переключиться с Java на Python для проекта, над которым работал два года назад, прежде чем я был готов выбрать плагин Java для горячей перезагрузки класса. Извините, но у меня нет никаких выводов, чтобы поделиться.   -  person PJvG    schedule 05.10.2015
comment
В порядке. Итак, в python уже встроена горячая замена класса?   -  person Martin Kersten    schedule 05.10.2015
comment
@Martin Я никогда не говорил и не подразумевал этого, но кажется, что Python действительно имеет горячий класс /module reloading build in (если я правильно понял). Я посмотрел это для вас. Однако я отказался от использования горячей перезагрузки класса. Это больше не требовалось для проекта. Поэтому я не знаю, насколько хорошо работает перезагрузка Python или применима ли она к вашей ситуации. Я не думаю, что смогу быть вам здесь чем-то полезен. Удачи во всем, что вы планируете делать.   -  person PJvG    schedule 05.10.2015
comment
Извините, что смутил вас. Я просто подумал, что горячая перезагрузка класса была своего рода требованием. Спасибо, что посмотрели это. Я посмотрел, и у механизма есть довольно интересные оговорки и угловые случаи. Для себя я кусаю пулю и реализую механизм перезагрузки класса с нуля, потому что большинство опций либо с закрытым исходным кодом, либо из того, что я прочитал, не нравится реализация или она слишком сложна. Так что еще раз спасибо за поиск.   -  person Martin Kersten    schedule 05.10.2015


Ответы (2)


Отказ от ответственности. Я участвую в разработке JRebel, поэтому мой ответ может показаться немного предвзятым, но я постараюсь объяснить.

Чтобы ответить на этот вопрос, я сначала хочу обратить ваше внимание на то, что одно из основных отличий среди названий, которые вы перечислили, состоит в том, что некоторые решения требуют от вас изменения дизайна приложения, другие - нет.

Решения модульности, такие как OSGi или модули JBoss, дают преимущества, если вы следуете правильному пути и модулируете свое приложение. В противном случае, если вы развертываете один изолированный пакет, это в основном означает, что вы перезапускаете/повторно развертываете все приложение, тем самым уменьшая любые преимущества, полученные от этого подхода.

Play Framework на самом деле представляет собой полнофункциональную платформу с возможностью горячего развертывания. Эти возможности различаются в зависимости от используемой версии фреймворка. Но опять же, та же история, что и с модульностью — фреймворк навязывает определенную модель программирования.

Apache Commons JCI на самом деле не является решением для оперативного обновления кода. Насколько я знаю, он просто компилирует и загружает класс через новый загрузчик классов. Это также включает в себя изменение кода приложения, как в случаях, упомянутых выше. Я не совсем уверен, хорошо это или плохо. Недостатком является то, что вы вряд ли сможете сделать какую-либо широкую интеграцию с экосистемой таким образом. Такой подход вполне осуществим для самодельного фреймворка, использующего эту функцию. Лично я бы предпочел использовать язык сценариев, такой как Groovy, JRuby или JavaScript, для достижения того же. Например, что-то вроде этого.

JRebel, Fakereplace и DCEVM — этим ребятам наплевать на модель программирования. Но разница довольно большая:

DCEVM исправляет JVM, и его цель — предоставить полное решение для горячей замены, что она и делает.

JRebel – это Java-агент (подключенный с помощью аргумента -javaagent VM), который обрабатывает код приложения и загружает новые версии классов, управляя их версиями. Основная ценность JRebel заключается в том, что он обеспечивает гибкую настройку наряду с огромным количеством интеграций с конкретными фреймворками, так что вы можете делать намного больше, чем просто горячая замена классов Java. Например, добавляйте и автоматически связывайте новые bean-компоненты в контексте приложения Spring, добавляйте новые EJB на лету, новые действия Struts и т. д.

Fakereplace также является инструментальным агентом, как и JRebel, но он гораздо меньше поддерживает изменения кода Java (я полагаю), а количество поддерживаемых фреймворков не так впечатляет.

Fenix может делать столько, сколько позволяет ему Java Instrumentation API. Что в основном означает, что на самом деле он не добавляет ценности поверх стандартного HotSwap JVM. То же самое для AgentSmith

ОБНОВЛЕНИЕ: этот ответ побудил автора Feenix придумать новую версию - Feenix 2.0, которая напоминает способ работы JRebel с классами. Но как говорит сам автор - Feenix все равно сильно уступает JRebel. Есть также несколько похожих решений, таких как HotswapAgent и Spring Loaded — эти инструменты также предоставляют аналогичные функции, но по-своему ограничены.

Теперь немного о вашей конкретной проблеме, как ее можно решить с помощью JRebel:

Каждый модуль приложения должен иметь собственный файл конфигурации rebel.xml. Под модулем мы подразумеваем либо EAR, WAR, либо любую из JAR-зависимостей в WEB-INF/lib (как в вашем случае), либо специфичные для сервера библиотеки. Файл конфигурации указывает на каталог, в котором находятся скомпилированные классы, и JRebel загрузит классы непосредственно из этого места. Все это означает, что вам не нужно собирать весь JAR после внесения изменений в класс Java. Вместо этого вы вносите изменения и компилируете исходный код (используя IDE вместо скрипта сборки). Скомпилированный класс будет перезагружен JRebel после вызова класса в коде приложения.

person Anton Arhipov    schedule 14.07.2013
comment
Спасибо за развернутый ответ! Это очень полезно. Есть ли причина, по которой вы не упомянули Apache Commons JCI FAM и AgentSmith в своем ответе? - person PJvG; 16.07.2013
comment
Поскольку ZeroTurnaround отменяет свою модель плавающей лицензии, я ищу альтернативы JRebel и нашел этот отличный ответ. А пока появился новый ребенок в блоке: github.com/spring-projects/ подпружиненный . У него есть свои ограничения, но то, что он делает, он делает хорошо. - person Marcel Stör; 09.12.2014

На блоке есть новый ребенок, RelProxy, это открытый исходный код, не такой продвинутый, как JRebel, но его можно использовать для свободного изменения подмножества вашего кода во время выполнения и перезагрузки его практически без потери производительности и без необходимости перезагрузки контекста (без потери сеанса) в разработке и производстве, если хотите.

person jmarranz    schedule 30.01.2015