Когда вы обновляете пакет, используя команду OSGi ' update ', он, скорее всего, будет иметь другие зависимые пакеты, которые полагаются на него и уже захватывают набор загруженныхклассы из старой версии этого комплекта.Ситуация, которая обычно соответствует проблеме, описанной вами в вашем вопросе.
Чтобы избежать возможного несоответствия между различными версиями классов, включенных в этот пакет, контейнер OSGi решает временно скрыть новую версию обновленных классов пакета от внешнего мира.Вы можете думать об этом как о сохранении обновленных классов изолированно от других пакетов - на мгновение -.
Дело в том, что контейнер OSGi не может просто начать загрузку классов изновая версия целевого комплекта, поскольку зависимые комплекты в конечном итоге будут видеть старые версии уже загруженных классов, смешанные с новыми версиями тех же классов, которые были загружены после обновления, что может привести к несогласованности, которая приведет кнеконтролируемый беспорядок.То же самое касается удаления пакета, пакет удаляется из списка установленных пакетов, но не удаляется из памяти.Он должен храниться так, чтобы зависимые комплекты могли продолжать загружать из него классы.
Таким образом, вы можете думать о команде «update», как о введении новой версии того же комплекта, что она будет поставляется в зависимые пакеты, которые еще не поступили, - которые еще не были на момент обновления -.Хотя старая версия, существовавшая до обновления, остается в памяти , чтобы обеспечить обратную совместимость и избежать возможных сбоев в работе существующих пакетов, которые уже начали зависеть от обновленного пакета.
Обратите внимание, что старые версии хранятся только в памяти, а это означает, что перезапуск сервера приведет к удалению всех этих старых версий и приведению последней версии к таблице.Это имеет смысл, потому что не будет необходимости в обратной совместимости, просто потому, что все пакеты теперь запускаются в одно и то же время.
Что происходит дальше, это то, что вы должны явно вызвать ' refresh 'команда для определенных пакетов, - те, которые зависят от обновленного пакета - или вместо этого вы можете выбрать команду «обновить» без указания конкретного пакета, что означает, чтовсе связки будут обновляться вслепую.Команда «refresh» вызывает перестройку дерева зависимостей целевых комплектов и заставляет их загрузчики классов начинать загрузку необходимых классов с нуля.
Только тогда зависимые комплекты начнут видеть измененияВы внесли в код обновленных классов классы, которые были обновлены.
Правило состоит в том, что
Существующие разрешенные пакеты уже импортируют более старую версиюкласс не будет автоматически переадресован на новый пакет, если он не обновлен.