2013-03-15 3 views
2

У меня есть модульное приложение, использующее инфраструктуру OSGi. Здесь я использую контейнер org.eclipse.equinox.common_3.4.0 OSGi. Итак, теперь приложение уже запущено со всеми пакетами osgi, установленными и активными, и я показываю все активные пакеты OSGi в пользовательском интерфейсе, путем циклирования с помощью хэш-карты, основанной на некоторых действиях. Теперь, когда приложение уже запущено, я хочу установить новый пакет OSGi из файловой системы, передав этот новый пакет в контейнер OSGi приложения, чтобы он запустил этот пакет.Загрузка динамического пакета OSGi из файловой системы

Как это достичь? Я попытался прочесть пакет OSGi как JarInputstream и прочитать полный путь к активатору пучка пакетов и попытался создать экземпляр этого метода с помощью Class.forName ("") и ввести тип в интерфейс BundleActivator. Но при запуске он принимает контекст связности в качестве аргумента для запуска метода.

Есть ли способ, когда я могу просто предоставить пакет OSGi в контейнер прагматично, чтобы он позаботился об установке и запуске пакета, а затем мой пользовательский интерфейс автоматически подберет это новое имя пакета на дисплее.

ответ

4

Если у вас есть файл для загрузки, вы можете установить пакет, как:

void install(BundleContext context, File file) throws Exception { 
    Bundle b = context.installBundle(file.toURI().toString()); 
    b.start(); 
} 

И вы можете удалить его (если файл уже нет):

void uninstall(BundleContext context, File file) throws Exception { 
    Bundle b = context.getBundle(file.toURI().toString()); 
    b.uninstall(); 
} 

Вы получаете BundleContext из активированного метода активации компонента или декларативного обслуживания. Это рекомендуемые методы, но в отчаянном случаях вы также можете использовать:

BundleContext context = FrameworkUtil.getBundle(this.getClass()).getBundleContext(); 

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

+0

Лучше не использовать 'this.getClass()', потому что кто-то может подклассифицировать вас из другого пакета; то вы получаете неправильный контекст связки. При этом я всегда использую класс litereal, например. 'Foo.class'. –

+0

Спасибо, Питер. Решение сработало. Я использовал контекст связки из службы активации, и я мог прагматично загружать другие пакеты. Спасибо за ответ. –

+0

@Neil: это может быть неправильный контекст :-) Как я уже сказал, это метод последней инстанции. –

Смежные вопросы