Moduly plug-in a balíky

Mechanizmy podpory modulů plug-in se implementují za použití struktury OSGi. Z tohoto hlediska je modul plug-in totéž jako balík OSGi. Balík a jeho přidružené třídy specifikují a implementují proces pro načítání tříd Java, správu předpokladů a životní cyklus balíku. Ve zbytku tohoto výkladu používáme výrazy modul plug-in a balík navzájem zaměnitelně, pokud není řeč o konkrétní třídě v rámci OSGi.

Plug-in

Třída Plugin představuje modul plug-in, který je spuštěný v rámci platformy. Je to příhodné místo pro centralizování aspektů týkajících se životního cyklu modulu plug-in a jeho celkové sémantiky. Modul plug-in může implementovat specializovanou funkci pro aspekty start a stop svého životního cyklu. Každá metoda životního cyklu zahrnuje odkaz na BundleContext, který může poskytnout další informace.

Část životního cyklu start si zaslouží podrobnější pozornost. Už jsme si ukázali, že informace o modulu plug-in lze získat z jeho souboru typu manifest, aniž by bylo nutno jakoukoli část kódu modulu plug-in vůbec spustit. Obvykle nějaká akce uživatele v pracovní ploše způsobí řetěz událostí, který vyžaduje spuštění modulu plug-in. Z hlediska implementace se modul plug-in nikdy nespustí, dokud není nutno načíst třídu obsaženou v daném modulu plug-in.

Metoda start je vhodným místem pro implementaci inicializačního a registračního chování pro modul plug-in. Je však důležité si uvědomit, že váš modul plug-in může být spouštěn za mnoha různých okolností. I něco tak jednoduchého, jako je získání ikony k dekoraci objektu, může způsobit načtení některé ze tříd vašeho modulu plug-in, v důsledku čehož se modul plug-in spustí. Příliš snaživá inicializace může způsobit, že se kód a data vašeho modulu plug-in načtou mnohem dříve, než kdy je to skutečně nezbytné. Proto je důležité se podrobně zabývat inicializačními úlohami vašeho modulu plug-in a zvážit alternativní možnosti namísto provádění inicializace při spuštění.

Kontext balíku

Správa životního cyklu je bodem, kde se setkává terminologie "balíků" OSGi a terminologie "modulů plug-in" platformy. Při spuštění váš modul plug-in obdrží odkaz na BundleContext, z něhož může získat informace, jež se modulu plug-in týkají. BundleContext lze také použít k zjištění informací o dalších balících nebo modulech plug-in v systému.

BundleContext.getBundles() lze využít k získání pole všech balíků v systému. Je možno zaregistrovat listenery pro BundleEvent, aby se váš modul plug-in dozvěděl, že u jiného balíku došlo ke změně stavu životního cyklu. Další informace najdete v dokumentaci javadoc pro BundleContext a BundleEvent.

Před verzí 3.0 sloužil k poskytování podobných informací registr modulů plug-in (IPluginRegistry). Šlo v něm například vyhledat deskriptory všech modulů plug-in v systému. Tento registr je nyní nepřípustný a k tomuto účelu je nutno používatBundleContext. Registr platformy se nyní používá výhradně pro informace o rozšířeních a bodech rozšíření.

Aktivátor balíků

Rozhraní BundleActivator definuje spouštěcí a ukončovací chování implementované ve třídě Plugin. Přestože třída Plugin je příhodným místem pro implementaci této funkce, vývojář modulu plug-in má naprostou volnost a rozhraní pro BundleActivator může implementovat v libovolné třídě vhodné pro návrh modulu plug-in. Váš modul plug-in ve skutečnosti nemusí toto rozhraní implementovat vůbec, pokud nemá specifické potřeby správy životního cyklu.

Balíky

Podkladem každého modulu plug-in je balík OSGi spravovaný strukturou OSGi. Balík je jednotkou modularity OSGi. V podstatě je balík jen kolekcí souborů (prostředků a kódu) instalovaných v platformě. Každý balík má svůj vlastní zavaděč tříd Java a zahrnuje protokol pro své spuštění, zastavení a odinstalování. Z hlediska platformy Eclipse je Bundle pouze implementační třídou. Vývojáři modulů plug-in nerozšiřují třídu balíku, nýbrž používají tříduPlugin nebo jiné implementace BundleActivator k reprezentaci modulu plug-in.