Как работать с частыми развертываниями пакетов локальных моментальных снимков на Karaf?

Я решил создать приложение поверх OSGI и Karaf — мне это очень нравится. Тем не менее, я немного борюсь с ежедневным развертыванием на моей локальной машине разработки. Я имею в виду... Я вношу изменения, а затем хочу протестировать их на своем локальном экземпляре Karaf. И это может происходить пару раз в час.

То, как я это делаю сейчас, - это сборка maven, которая создает пакет JAR, а затем копирует его в каталог развертывания Karaf. Я думаю, что это совсем не элегантно.

Я пытался найти способ обойти (гугл). Я читал о функциях Karaf, но кажется, что, несмотря на то, что это хороший механизм для развертывания всего приложения, он не решает мою проблему. Насколько я понимаю, он не проверяет, появилась ли новая версия моей банки SNAPSHOT в моем локальном репозитории maven, верно?


person Michal Chudy    schedule 16.07.2014    source источник
comment
Почему бы не запустить фреймворк OSGi прямо из вашей IDE?   -  person Neil Bartlett    schedule 17.07.2014
comment
Предлагаете ли вы запускать фреймворк Karaf/OSGI при каждом запуске приложения? Или пакетное развертывание на Karaf с помощью IDE?   -  person Michal Chudy    schedule 17.07.2014
comment
Я предлагаю запускать пакет в среде OSGi каждый раз, когда вам нужно его запустить. Karaf — это сервер приложений, я бы не хотел развертывать его для разработки.   -  person Neil Bartlett    schedule 17.07.2014
comment
Сложность при использовании этого подхода в karaf заключается в том, чтобы воссоздать среду в чистом фреймворке OSGi, которая достаточно похожа на karaf, чтобы быть полезной. Довольно часто это слишком много работы, чтобы быть выполнимым. (например, когда вы работаете с jpa в своем комплекте, вам нужно развернуть очень много karaf, чтобы он работал)   -  person Christian Schneider    schedule 17.07.2014
comment
Кроме того, приложение состоит из множества различных пакетов, которые взаимодействуют друг с другом. Я хотел бы проверить, как ведет себя приложение, когда одно из них необходимо обновить на лету. Это очень важно для проверки правильности поведения всех служб и их зависимостей при обновлении некоторых частей приложения.   -  person Michal Chudy    schedule 17.07.2014


Ответы (1)


Ключом к тому, чтобы заставить работать механизм обновления karaf, является развертывание из maven вместо использования папки развертывания. Установите свой пакет следующим образом:

install -s mvn:groupid/artifactID/version

or

install -s mvn:groupid/artifactID/version/typeOfMavenArtifact

Второй полезен для установки, например, артефактов war/wab. Полную спецификацию протокола maven можно найти здесь.

Тогда Караф знает, откуда взялся сверток. Вы также можете проверить это, используя la -u. Это заставляет karaf показывать местоположение обновления, которое теперь должно быть maven uri. Вы не заметите, что все пакеты karaf имеют такое расположение обновлений.

Теперь, когда вы создадите новую сборку своего проекта с помощью maven, она попадет в ваш локальный репозиторий maven. Затем просто запустите

update <bundleid>

Это заставляет karaf проверять местоположение обновления (в вашем случае это локальное репозиторий maven) и перезагружать оттуда пакет.

Вы можете еще больше автоматизировать это, используя

dev:watch

или для карафа 3+

bundle:watch

Это заставит karaf проверять ваш репозиторий maven на наличие изменений в развернутых пакетах SNAPSHOT и автоматически повторно развертывать их.

Это также очень хорошо работает вместе с удаленной отладкой. Использовать

export KARAF_DEBUG=true

до начала карафа. Затем он будет прослушивать отладчик на порту 5005.

Затем вы можете запустить сеанс удаленной отладки eclipse на том же порту и красиво отладить свое приложение в karaf. Это работает очень хорошо, даже если вы измените свой пакет, используя один из описанных выше подходов. Таким образом, вы можете отлаживать, находить свою проблему, изменять код, собирать и продолжать отладку с измененной версией.

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

person Christian Schneider    schedule 17.07.2014
comment
Кажется, это не работает для нас в Karaf 4.0.4. Команда update <bundleid> работает только один раз для обновления пакета из нашего удаленного репозитория maven (Nexus). После этого будущие команды обновления ничего не делают, хотя у нас указано @snapshotUpdate=always. Если мы перезапустим Karaf, то следующее обновление сработает (только один раз). - person Michael Lucas; 13.10.2016
comment
Это предназначено только для локального репозитория. Вы компилируете снимок локально, и он будет автоматически обновлен. Каков ваш вариант использования удаленного репо? - person Christian Schneider; 13.10.2016
comment
У нас есть серверы DEV, на которые мы хотим развернуть артефакты моментальных снимков. Сначала мы создаем их с помощью нашего CI-сервера (Bamboo), который размещает их в удаленном репозитории Nexus. Затем мы хотим развернуть их с помощью команды bundle:update оболочки karaf. (Или иногда с помощью кнопки «Обновить» в веб-консоли karaf.) Это работает для артефактов выпуска, но для моментальных снимков возникают проблемы, которые я описал. - person Michael Lucas; 13.10.2016
comment
Хорошо, мы нашли способ исправить нашу проблему со снимками, не загружаемыми с удаленного репозитория. Нам пришлось добавить системное свойство aether.updateCheckManager.sessionState=false. Затем он проверяет удаленное репо каждый раз, а не только один раз за сеанс. - person Michael Lucas; 13.10.2016
comment
Мы перепробовали практически все, что могли, и из журналов поняли, что проблема была связана с эфирным компонентом, говорящим, что он намеренно не обновлялся из удаленного репо, потому что он уже обновил этот сеанс или что-то в этом роде. Другой разработчик в моем офисе копался в исходном коде и нашел системное свойство, которое могло управлять проверкой на основе сеанса. - person Michael Lucas; 16.10.2016