Статьи

Javeleon: расширение платформы NetBeans с помощью динамического обновления активных модулей

Аллан Грегерсен — сотрудник Post.doc в Институте Макерни Моллера при Университете Южной Дании, занимающийся исследованиями систем динамического обновления.

Он отвечает за Javeleon , новый небольшой инструмент для повышения продуктивности разработчиков для разработчиков Java.

Привет Аллан, что такое Javeleon?

Javeleon был разработан в Университете Южной Дании в сотрудничестве с Sun Microsystems / Oracle в качестве исследовательского проекта. Название «Javeleon» — это попытка проявить творческий подход, объединив «Java» и «Chameleon», которые, как и система динамического обновления, обладают естественными адаптивными навыками при изменении среды.

Javeleon использует такие инструменты, как JRebel ZeroTurnaround и Oracle WebLogic FastSwap. Эти инструменты позволяют вносить изменения в ваши классы Java во время работы тестового экземпляра вашего приложения. Например, если на полпути через «мастера» в тестируемом приложении разработчик замечает сбой включения кнопки «Далее>» при правильных условиях, должна быть возможность исправить явную ошибку в коде, возможно, перегруппировав некоторые служебные методы. или даже вводя совершенно новые классы, выберите «Перезагрузить» в IDE, а затем сразу же увидите, как кнопка мастера начинает работать в соответствии с новой логикой, даже не требуя перезапуска мастера.

И выгода в том, что разработка происходит быстрее? 

Да, быстрое выполнение работ, очевидно, исключает потерю рабочего времени, но, что еще важнее, позволяет избежать концентрации внимания программиста в критический момент.

Чем Javeleon отличается от двух других упомянутых вами продуктов, JRebel и FastSwap?

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

Можем ли мы взглянуть на конкретный пример, в котором мы противопоставляем подходы, принятые между Javeleon, JRebel и FastSwap?

Конечно. Прежде всего, Javeleon поддерживает изменения времени выполнения в иерархиях типов классов. Один из примеров, где это становится интересным, — это то, где вы хотите выделить общие черты в паре классов, создав новый суперкласс, сохранив при этом различия в существующих подклассах. Давайте возьмем следующий пример кода:

// Version 1

class BluRayDisc {

private String title;

private int duration;

private List actors;

...

}

Теперь давайте предположим, что вы хотите добавить свою коллекцию CD в это приложение. Следуя стандартной практике, вы в конечном итоге (значительно упростили) этот код:

// Version 2

class BluRayDisc extends PlayableMedia {

private List actors;

...

}

class CD extends PlayableMedia {

private List artists;

...
}

class PlayableMedia {

private String title;

private int duration;

}

Хотя такие инструменты, как JRebel или FastSwap, не смогут выполнять такие обновления, Javeleon добьется успеха. Существующие экземпляры «старого» класса BluRayDisc, созданные до обновления, будут вести себя так, как если бы они были созданы в версии 2 после обновления! Даже значения атрибутов в старом классе BluRayDisc, которые были учтены обновлением (здесь «title» и «duration»), будут автоматически перенесены в соответствующие атрибуты в новом суперклассе для существующих объектов BluRayDisc.

Еще одна очень удобная и новая функция Javeleon — поддержка назначения значений для вновь добавленных полей экземпляра. В приведенном выше примере с приложением Media выясняется, что разработчик хочет напрямую связываться с IMDB BluRayDiscs. Итак, в версии 3 класса BluRayDisc добавлено следующее:

// Version 3

class BluRayDisc extends PlayableMedia {

private List actors;

// field for storing the IMDBLink

private URL IMDBLink = IMDBUtil.searchForIMDBLink(this.title);

...

}

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

В этом примере Javeleon выполнит специальный код для назначения поля IMDBLink, сохраняя при этом существующие значения полей для всех существующих полей экземпляра. Это очень мощная функция, если вы спросите меня! Однако существуют некоторые ограничения для этих назначений полей: 1) ветвление не будет работать, поэтому конструкция if-else не будет работать и 2) несколько назначений полей в одной строке кода не будут работать (например, int a = b = c = 43) Javeleon выдаст предупреждение во время загрузки, что такие назначения не могут быть применены автоматически.

Что спровоцировало процесс создания Javeleon в первую очередь?

Процесс начался в 2006 году, когда я обнаружил, что отсутствие динамического обновления активно работающих подключаемых модулей Eclipse в Eclipse IDE раздражает. Я решил найти решение в области исследований и применить лучшего кандидата во время моей магистерской диссертации. К сожалению, я обнаружил, что в то время не было подходящего (читай «идеального») решения этой проблемы, поэтому мне пришлось работать немного усерднее, чтобы выполнить работу. К счастью, на ранних этапах процесса я понял основную идею Javeleon. Оттуда уже не было пути назад, и я получил степень доктора философии. в апреле 2010 года дальнейшее развитие модели Javeleon.

Каков текущий статус Javeleon?

Текущий статус Javeleon заключается в том, что он готов к серьезному бета-тестированию большим сообществом разработчиков. На данный момент мы решили выпустить специализированную версию Javeleon, в которой добавлена ​​поддержка динамического обновления модулей NetBeans в работающем приложении во время разработки, которую мы можем назвать «тестовым экземпляром». Простота использования была основным приоритетом для нас. Поэтому разработчикам нужно только установить модуль NetBeans, который позволит им добавлять Javeleon в проекты платформы NetBeans. После того, как они включили Javeleon для проекта, они просто запустят приложение как обычно. Это улучшит традиционную функцию перезагрузки модуля NetBeans, вызываемую через пункт меню «Перезагрузка в целевой платформе». Когда этот пункт меню вызывается, модуль будет прозрачно обновлен,сохраняя все существующие объекты в приложении.

Почему была выбрана платформа NetBeans, почему вы не создали ее для Eclipse RCP?

Основной причиной выбора платформы NetBeans вместо Eclipse RCP является наше сотрудничество с Oracle. Кроме того, учитывая, что это все еще исследовательский проект, у нас нет ресурсов для интеграции Javeleon с какой-либо компонентной платформой. Кроме того, платформа NetBeans сейчас является наиболее инновационной альтернативой на рынке, поэтому я считаю, что она идеально подходит. Тем не менее, возможно, что интеграция с другими платформами будет запрошена и, возможно, даже внесена сообществом таким же образом, как и встроенные подключаемые модули JRebel. Только время покажет, куда направляется Джавелеон.

Как начать работать с Javeleon?

Перейти в Инструменты | Плагины и добавьте этот URL на вкладке Настройки, указывая на центр обновлений Javeleon:

http://javeleon.org/javeleon-update-site/

Вы должны увидеть это:

Теперь вы можете получить доступ к плагину Javeleon и завершить работу мастера.

После того как вы сделали вышеупомянутое, вам нужно включить Javeleon в вашем проекте платформы NetBeans через «Добавить Javeleon в проект»:

 

После того, как вы выбрали «Добавить Javeleon в проект», Javeleon добавляет строку установки Javeleon в файл «project.properties» приложения. Для поддержки нескольких пользователей, использующих одну и ту же установку, мы фактически поместили конфигурацию Javeleon в «private.properties», настроив агент Java для аргументов JVM. Если вы не хотите работать с включенным Javeleon в вашей производственной системе, вы должны удалить эти изменения. В настоящее время не поддерживается удаление Javeleon из приложения, но пользователи могут просто удалить {$ javeleon.args} в строке «run.arg.extra» проекта.properties, если они хотят работать без Javeleon.

Чем отличается Javaleon от того, что делает «Перезагрузка в целевой платформе»?

Поскольку мы хотели быть максимально прозрачными при стандартном использовании цикла развертывания приложений на платформе NetBeans, мы просто воспользовались существующей функцией «Обновить в целевой платформе». Вот разница между существующей реализацией этой функции и тем, что вместо этого делает Javeleon:

  • Существующая функция «Обновить в целевой платформе» выполняет полную замену существующего модуля и всех его транзитивно-зависимых модулей. Эта функциональность не только стирает весь граф объектов, но также оставляет потенциально «устаревшие» объекты (как часть состояния в не обновленных модулях), просто ожидая выдачи странных исключений приведения классов или ошибок компоновки.
  • Javeleon изменяет это поведение, перезагружая модуль «На месте», сохраняя все существующие экземпляры. Затем вы можете спросить, почему мы не просто слушаем изменения файловой системы, но и делаем это слишком быстро, если обновление охватывает несколько модулей, например, когда базовый модуль построен с двоичной несовместимостью с клиентскими модулями и обновленным модулем. клиентские модули еще не были собраны. Поэтому мы считаем, что лучший способ выполнить обновления модулей — позволить разработчикам выбирать, когда их применять.

Как только Javeleon будет включен, что нужно сделать, чтобы убедиться, что Javeleon работает, и опробовать его возможности?

Создайте новый модуль в приложении, где вы включили Javeleon. В этом приложении используйте мастер New Action в IDE для создания нового Action в вашем приложении. В методе ActionPerformed Action напишите код, который вы хотите использовать в качестве теста для начальной версии. Запустите это приложение и запустите действие в тестовом экземпляре.

Теперь оставьте приложение запущенным. Вернитесь к IDE и внесите изменения в класс Action. Вы можете внести любые изменения в этот класс (или добавить новые классы, которые будут использоваться методом Action). Несколько небольших вещей, чтобы попробовать:

  • Самый простой способ проверить поддержку изменения иерархии типов — это просто добавить новое предложение «Implements» в этот класс действия (например, «Implements Runnable») и попытаться запустить новый поток.
  • Чтобы проверить способность Javeleon изменить суперкласс, сделайте следующее: 1) добавьте второй класс в модуль, 2) перезагрузите модуль, 3) измените суперкласс созданного класса 4) перезагрузите модуль снова, и вы будете возможность использовать этот новый тип, даже для существующих экземпляров в системе.

Есть ли другие вещи, которые Javeleon делает в этом контексте?

Ну, вы знаете, обновление современных приложений — это гораздо больше, чем просто обновление кода. Существуют всевозможные ресурсы и кэши, которые необходимо учитывать. При разработке платформы NetBeans у вас есть, например, файлы слоев, которые разрешают декларативную регистрацию элементов пользовательского интерфейса. Чтобы действительно обновить активно работающие модули, вам также необходимо опубликовать изменения в этих ресурсах. Javeleon сделает это за вас.

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

Вы работали с гуру платформы NetBeans Джесси Гликом над этим проектом. Вы можете что-нибудь сказать об этом?

Правда, иметь Джесси в качестве технического спонсора было большим опытом. Я не думаю, что вы можете получить более квалифицированного человека, чем Джесси для этого проекта. Кэтрин Хартселл из внешнего исследования Oracle помогла в создании матчей, и это сработало отлично. Джесси был отличным партнером со многими ценными комментариями, предложениями и т. Д.

Какую обратную связь вы хотите получить от разработчиков, опробующих Javeleon?

Мы были бы очень рады получить любую обратную связь от людей, пробующих Javeleon. Система работает достаточно стабильно для тестируемых нами установок, но мы знаем, что есть вероятность, что Javeleon еще недостаточно хорошо справляется с некоторыми угловыми случаями, чтобы быть полезными. Я думаю, ребята из JRebel из ZeroTurnaround согласятся с тем, что динамическое переопределение классов — непростая задача для объектно-ориентированного языка со статической типизацией.

В основном, мы приветствуем все отзывы. Мы сделаем все возможное, чтобы постоянно улучшать Javeleon. Известные проблемы будут описаны на сайте, поэтому мы надеемся, что люди будут проверять на сайте, прежде чем отправлять отзывы. Пока что люди могут просто присылать свои отзывы на support@javeleon.org .

Будете ли вы в JavaOne?

Да, если люди хотят поговорить со мной или одним из других членов команды во время конференции, я предпочитаю договориться о договоренности по электронной почте на allang@mmmi.sdu.dk , так как я не буду находиться на стенде , Я сделал BOF на прошлогодней JavaOne, но я не буду давать официальных докладов в этом году.

Если люди интересуются небольшой демонстрацией, мы создали небольшое количество ревизий клона Space Invaders, построенного на платформе NetBeans, который демонстрирует некоторые замечательные новые возможности с динамическим обновлением приложения.