Установка нескольких пакетов из одного источника - PullRequest
3 голосов
/ 13 августа 2010

Я использую Apache Karaf в качестве контейнера OSGi. У Karaf есть упаковщик URL, который может устанавливать пакеты прямо из репозитория maven

> install mvn:com.farpost.billing/background-service/2.2-SNAPSHOT
Bundle ID: 139

Все работает просто отлично. Но я хочу запустить несколько пакетов из данного источника. Это имеет смысл, если новая связка порой ломала производственный сервис и я хочу откатиться. С OSGi это очень просто

 > list 
 [ 139] [Active     ] [            ] [Started] [   60] Billing background service (2.2-20100811-1232)
 [ 140] [Resolved   ] [            ] [       ] [   60] Billing background service (2.2-20100809-1127)
 > update 140
 > list
 [ 139] [Active     ] [            ] [Started] [   60] Billing background service (2.2-20100811-1232)
 [ 140] [Resolved   ] [            ] [       ] [   60] Billing background service (2.2-20100812-1354)
 > start 140
 > stop 139
 > list
 [ 139] [Resolved   ] [            ] [       ] [   60] Billing background service (2.2-20100811-1232)
 [ 140] [Active     ] [            ] [Started] [   60] Billing background service (2.2-20100812-1354)
 #################
 # suppose we need to rollback here
 #################
 > start 139
 > stop 140

Проблема в том, что я не могу создать несколько пакетов из одного источника:

> install mvn:com.farpost.billing/background-service/2.2-SNAPSHOT
Bundle ID: 139
> install mvn:com.farpost.billing/background-service/2.2-SNAPSHOT
Bundle ID: 139

Второй install вызов ничего не делает, но возвращает уже существующий идентификатор пакета. Итак, мой вопрос, есть ли способ создать несколько пакетов из одного исходного URL-адреса?

Ответы [ 3 ]

2 голосов
/ 19 августа 2011

Можно установить несколько пакетов одновременно, используя файл функций.В настоящее время у нас есть файл функций, который определяет около 6-7 пакетов.Кроме того, файл содержит одну функцию, которая требует другой 6-7.Устанавливая функцию «мастер», Karaf устанавливает все следующие комплекты одновременно.И если вы хотите, вы можете сделать так, чтобы Karaf запускал эти связки при запуске.

Для того, чтобы сделать это:

  1. Создайте файл функций.Больше можно найти здесь: внешний источник

  2. Поместите файл с этими функциями где-нибудь в вашем каталоге m2.

  3. Изменить организацию.apache.karaf.features.cfg в домашнем каталоге Karaf.Добавьте URL-адрес mvn в файл функций, который вы только что создали, в тег «featuresRepositories».При желании добавьте имя функции в "featuresBoot", если вы хотите, чтобы она загружала их при запуске.

  4. После запуска Karaf вы можете ввести "features: install name_of_feature",Это запустит функцию и все остальное, в чем нуждаются функции, как определено в файле функций.

Затем вы можете напечатать список, чтобы убедиться, что все необходимые пакеты работают.Недостатком является необходимость обновления в случае изменения каких-либо пакетов или добавления новых.

Надеюсь, это поможет.

2 голосов
/ 15 августа 2010

Вы столкнулись с проблемой, что вы не можете установить более одной копии пакета с одинаковым символическим именем и версией.

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

В конце я бы посоветовал вам установить именно тот пакет, который вы хотите. Если с ним возникли проблемы, откатитесь, удалив неисправный комплект и установив старую версию. Если вы хотите автоматизировать установку и обновление (наборов) комплектов, взгляните на Apache ACE, среду обеспечения программного обеспечения для OSGi, которая поможет вам автоматизировать такие сценарии (и управлять системами OSGi в целом).

1 голос
/ 20 августа 2011

РЕДАКТИРОВАТЬ: Только что увидел это сообщение год! RSS-поток Stackoverflow поместите это в начало моего списка!?!

+ 1 к Марселю и Тони, как правильно.

Пакет в состоянии RESOLVED является операцией экспорта / импорта пакетов ( ACTIVE означает, что любая активация служб была инициирована и завершена), и вам следует использовать функции Karaf. В настоящее время мы вручную проверяем наш файл функций karaf (см. Документацию в формате PDF в загрузке дистрибутива), так как плагин v2.x создает отдельную функцию для каждой зависимости и является немного странным (я не пробовал trunk / v3, но он кажется фиксированной )

То, что вы пытаетесь, имеет две ошибки;

  1. Команда pax maven url handler распознает, что пакет уже установлен, и ничего не делает
  2. Даже если это произойдет, то 2-й комплект потерпит неудачу, так как наиболее вероятно , символическое имя будет идентично 1-му

(Худший) Вариант 1:

Если вы действительно отчаянно хотите обойти эту проблему, предполагая, что вы используете плагин maven-bundle-plugin, добавьте buildnumber-maven-plugin и это в конфигурацию пакета:

<Bundle-SymbolicName>${project.artifactId} ${buildNumber}</Bundle-SymbolicName>

Затем при установке пакетов используйте явную версию моментального снимка (SNAPSHOT в названии версии концептуально представляет собой просто ссылку на хранилище с последней версией с меткой времени):

install mvn:com.farpost.billing/background-service/2.2-20100812-1354

При использовании этой опции, как заявляет Марсель, вы могли бы импортировать другие пакеты пакетов, привязанные к пакету RESOLVED , при импорте услуг из пакета ACTIVE - поэтому несоответствия классов могут сломать вашу систему .

(Менее плохо) Вариант 2:

Чуть лучше (и без изменений в pom.xml):

  1. Обратите внимание на точную временную версию пакета
  2. Вызвать команду refresh
  3. Для отката удалите комплект и установите ранее отмеченную версию

С помощью этой опции, как заявляет Тони, вы управляете всеми этими пакетами индивидуально, что является болезненным и опасным (что работает с чем? Где это записано?). Функции Karaf и плагин version-maven-plugin были бы намного лучшим решением

(Хорошо) Вариант 3:

  1. Разделите свой пакет на две части; комплект API и комплект реализации - таким образом, переключение комплекта реализации (сервисы и реальная логика) не повлияет на проводку пакета только на разрешение сервиса
  2. Используйте схему управления версиями OSGi, она имеет разумный синергизм с версиями Maven (см. семантическое управление версиями pdf и публикацию Питера Криенса о отрицательных квалификаторах ). Схема MAJOR.MINOR.MICO.qualifier, где микро числа, которые не добавляют никакой новой функциональности, кроме исправления ошибок
  3. SNAPSHOT следует использовать только для разработки, а не для производства, так как вы работаете с непроверенной, подверженной изменениям, движущейся целью (где вам действительно нужно использовать моментальные снимки, заблокируйте их до версии, с которой вы на самом деле работали используя версию с меткой времени (для сторонних зависимостей, которые вы должны использовать версию SNAPSHOT, здесь могут помочь версии-maven-plugin lock-snapshots цель)
  4. Используйте функции Karaf, это значительно упрощает управление большими наборами пакетов (разверните весь стек одной командой и обновите аналогичным образом)
...