Я бы сам посоветовал вам сделать следующее:
1. Разделите ваш API (Java-интерфейсы) и вашу реализацию на отдельные пакеты.
Таким образом, если только изменения в реализации API поддерживаются "живыми", это предотвращает отключение OSGI-служб. На сервисы ссылается интерфейс. Конечно, ваши потребители услуг должны иметь возможность иметь дело (временно) с несуществующими услугами.
2. Иметь четкую схему именования пакетов.
Я бы использовал версии в имени файла комплекта jar. Вы должны различать банки в файловой системе, и работа с версиями в имени файла очень помогает. Кроме того, если вы не используете версию, я бы беспокоился о перезаписи jar-файлов во время выполнения. Теоретически это должно работать, но вы никогда не знаете. Если у вас есть версии, вы не будете перезаписывать старые банки.
3. Используйте версии в Манифесте.
Кроме того, вы должны использовать свойство version в Manifst. Это, очевидно, меньше для вас, чем для вашего контейнера OSGI, чтобы отслеживать ваши пакеты.
После того, как вы успешно установили все ваши новые пакеты, я бы посоветовал вам удалить старые. Если вы использовали версии в своем имени файла, это должно быть довольно легко сделать. Если вы оставите старые банки, вы, вероятно, столкнетесь с более медленным временем запуска. Это потому, что, хотя ваш контейнер не использует пакеты, он должен загрузить и проверить их. А также они тогда живут в вашем классе и могут увеличить риск конфликтов.
Надеюсь, это вам немного поможет. Это хороший вопрос! Может быть, некоторые более опытные люди также разместят там предложения :) Я хотел бы услышать, что делают другие.