<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://www.multimediaexpo.cz/mmecz/skins/common/feed.css?270"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
		<id>http://www.multimediaexpo.cz/mmecz/index.php?action=history&amp;feed=atom&amp;title=OSGi_Service_Platform</id>
		<title>OSGi Service Platform - Historie editací</title>
		<link rel="self" type="application/atom+xml" href="http://www.multimediaexpo.cz/mmecz/index.php?action=history&amp;feed=atom&amp;title=OSGi_Service_Platform"/>
		<link rel="alternate" type="text/html" href="http://www.multimediaexpo.cz/mmecz/index.php?title=OSGi_Service_Platform&amp;action=history"/>
		<updated>2026-06-15T10:15:15Z</updated>
		<subtitle>Historie editací této stránky</subtitle>
		<generator>MediaWiki 1.16.5</generator>

	<entry>
		<id>http://www.multimediaexpo.cz/mmecz/index.php?title=OSGi_Service_Platform&amp;diff=223766&amp;oldid=prev</id>
		<title>Sysop: 1 revizi</title>
		<link rel="alternate" type="text/html" href="http://www.multimediaexpo.cz/mmecz/index.php?title=OSGi_Service_Platform&amp;diff=223766&amp;oldid=prev"/>
				<updated>2013-07-16T11:18:36Z</updated>
		
		<summary type="html">&lt;p&gt;1 revizi&lt;/p&gt;
&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
		&lt;tr valign='top'&gt;
		&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;← Starší verze&lt;/td&gt;
		&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;Verze z 16. 7. 2013, 11:18&lt;/td&gt;
		&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Sysop</name></author>	</entry>

	<entry>
		<id>http://www.multimediaexpo.cz/mmecz/index.php?title=OSGi_Service_Platform&amp;diff=223765&amp;oldid=prev</id>
		<title>Sysop: 1 revizi</title>
		<link rel="alternate" type="text/html" href="http://www.multimediaexpo.cz/mmecz/index.php?title=OSGi_Service_Platform&amp;diff=223765&amp;oldid=prev"/>
				<updated>2010-10-21T09:17:47Z</updated>
		
		<summary type="html">&lt;p&gt;1 revizi&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;'''OSGi Service Platform'''&amp;lt;ref&amp;gt;http://www.osgi.org/About/Technology&amp;lt;/ref&amp;gt; (dále ''OSGi Framework'', nebo jen ''Framework'') je specifikace dynamického modulárního systému pro [[Java (programovací jazyk)|programovací jazyk Java]]. Standard je definován a udržován mezinárodním konsorciem ''OSGi Alliance'' (původně ''Open Services Gateway initiative'', dnes se již nepoužívá). ''OSGi'' umožňuje instalaci a odebírání modulů za běhu, definuje životní cyklus modulu a nabízí infrastrukturu pro spolupráci modulů skrze služby. V současné době je ''OSGi Framework'' považován za nejvyspělejší modulární systém pro ''Javu''. Zakládají se na něm například nové verze téměř všech velkých aplikačních serverů.&lt;br /&gt;
&lt;br /&gt;
== Historie ==&lt;br /&gt;
Historie ''OSGi'' sahá až do roku 1998, kdy započaly práce na první verzi specifikace. Původně bylo ''OSGi'' cíleno na potřeby systémů pro chytré domácnosti. Díky tomuto původnímu zaměření je ''OSGi Framework'' velmi kompaktní. Plná implementace aktuální verze ''R4'' může být jediný jar s velikostí kolem 250KB ([[Knopflerfish]] [http://www.knopflerfish.org/]). K nárůstu pozornosti kolem OSGi došlo s úspěchem platformy [[Eclipse (vývojové prostředí)|Eclipse]], jež ve verzi 3.0 vyměnila proprietární modulární systém za vlastní implementaci ''OSGi'' [[Equinox]]. Další oblastí, kde došlo k rozšíření ''OSGi'', na poli aplikačních serverů – je základem nových verzí serverů [[WebLogic]], [[Websphere]], [[JBoss]], [[GlassFish]], [[JOnAS]] a dalších &amp;lt;ref&amp;gt;http://www.infoq.com/news/2008/02/osgi_jee&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
V poslední době se ''OSGi'' pomalu začíná využívat na poli enterprise aplikací, které jsou tradičně doménou [[Java EE]]. Zatím se jedná spíše o první pokusy, než masovou adopci ''OSGi Frameworku'' pro tvorbu enterprise aplikací. Mnoho vývojářů považuje vývojový model ''OSGi'' za příliš komplikovaný oproti ''Java EE'' a nevidí dostatek přínosů vyvažujících přidanou komplexitu zejména u malých a středních aplikací. Hlavní silou prosazující OSGi na poli enterprise aplikací se vedle dodavatelů jednotlivých implementací stala společnost [[SpringSource]] [http://www.springsource.com/] stojící za úspěšným [[Spring Framework]]. V případě [[SpringSource dm Server]] není ''OSGi'' využito pouze vnitřně v infrastruktuře serveru, ale je i základní jednotkou nasazení (deploymentu).&lt;br /&gt;
&lt;br /&gt;
== Architektura ==&lt;br /&gt;
Podívejme se podrobněji na architekturu ''OSGi Frameworku'' a její jednotlivé vrstvy.&lt;br /&gt;
&lt;br /&gt;
=== Execution Environment ===&lt;br /&gt;
''OSGi Framework'' je použitelný na široké škále virtuálních strojů včetně široké škály implementací v mobilních zařízeních. ''Execution Environment'' je abstrakcí [[JRE]] definující dostupné balíčky v daném prostředí. Každý modul přitom může uvést požadovaný minimální ''Execution Environment'' (množinu Java balíčků) potřebný k jeho běhu. Modul uvádějící jako požadovaný ''Execution Environment'' J2SE-1.5 tak půjde nainstalovat například do ''OSGi'' kontejnerů běžících nad [[Java 5|Javou 5]] či [[Java 6|Javou 6]], ale ne do kontejneru běžícího nad [[Java 1.4|Javou 1.4]], či virtuálním strojem podporujícím pouze [[Java ME|Javu ME]].&lt;br /&gt;
&lt;br /&gt;
=== Moduly ===&lt;br /&gt;
Jednotkou modularity v ''OSGi'' je takzvaný '''bundle''' (dále pouze modul, i když korektnější pojmenování by bylo balík, což by se ovšem pletlo s Java balíčky). Jedná se o běžný [[JAR (souborový formát)|jar]] archiv s několika speciálními hlavičkami v manifestu. Každý modul má za běhu speciálně vytvořený zavaděč tříd ([[classloader]]), který vidí pouze ''Java'' balíčky a zdroje (obrázky, konfigurační soubory a další) definované v modulu samotném, části standardní knihovny odpovídající specifikovanému ''Execution Environment'' a balíčky z ostatních modulů, které explicitně importuje. Níže je [[MANIFEST.MF]] soubor jednoduchého modulu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
Bundle-ManifestVersion: 2&lt;br /&gt;
Bundle-SymbolicName: org.example.bundle&lt;br /&gt;
Bundle-Version: 1.0.0&lt;br /&gt;
Bundle-Name: Ukázkový bundle&lt;br /&gt;
Bundle-Activator: org.example.bundle.Activator&lt;br /&gt;
Export-Package: org.example.bundle.package;version=&amp;quot;1.0.0&amp;quot;;uses:=&amp;quot; org.example.utility.package&amp;quot;&lt;br /&gt;
Import-Package: org.example.utility.package;version=&amp;quot;[1.4.0, 2.0.0)&amp;quot;&lt;br /&gt;
Require-Bundle: org.example.otherbundle;version=&amp;quot;[1.2.1, 2.0.0)&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Význam jednotlivých hlaviček je následující:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''Bundle-ManifestVersion:'''&amp;lt;/code&amp;gt; Indikuje verzi ''OSGi'' hlaviček v manifestu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''Bundle-SymbolicName:'''&amp;lt;/code&amp;gt; Jedinečný identifikátor modulu. Měl by dodržovat konvenci pro pojmenovávání balíčků v ''Javě'' a v ideálním případě být shodný s identifikátorem balíčku nejvyšší úrovně v daném modulu. Jedná se o jedinou povinnou hlavičku.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''Bundle-Version:'''&amp;lt;/code&amp;gt; Verze modulu skládající se ze tří číselných částí a volitelně jedné textové. Pokud není uvedena, uvažuje se verze &amp;lt;code&amp;gt;0.0.0&amp;lt;/code&amp;gt;. Každý modul by však měl specifikovat verzi.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''Bundle-Name:'''&amp;lt;/code&amp;gt; Člověkem čitelné pojmenování modulu například pro potřeby řídících systémů, kde se může zobrazit namísto či spolu se symbolickým jménem.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''Bundle-Activator:'''&amp;lt;/code&amp;gt; Třída implementující rozhraní &amp;lt;code&amp;gt;BundleActivator&amp;lt;/code&amp;gt; definující metody volané v rámci životního cyklu modulu. Definuje 2 metody (''start'' a ''stop''), ve kterých je jako parametr předáván &amp;lt;code&amp;gt;BundleContext&amp;lt;/code&amp;gt; – objekt umožňující interakci s okolím (vyhledávání a získávání služeb, registrace vlastních služeb, získávání informací o ostatních modulech a jejich stavech, možnost měnit stav ostatních modulů, programová instalace nových modulů a další). Aktivátor je volitelný.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''Export-Package:'''&amp;lt;/code&amp;gt; Jednotkou závislosti mezi moduly je jeden ''Java'' balíček. Tato hlavička říká, že balíček &amp;lt;code&amp;gt;org.example.bundle.package&amp;lt;/code&amp;gt; obsažený v našem ukázkovém modulu má být přístupný ostatním modulům. Dále uvádí verzi exportovaného balíčku (ta je v praxi často stejná, jako verze modulu, ale musí být u každého exportovaného balíčku explicitně uvedena). Nakonec je uvedena ještě ''uses'' direktiva, která říká, že třídy v balíčku &amp;lt;code&amp;gt;org.example.bundle.package&amp;lt;/code&amp;gt; využívají tříd z importovaného balíčku &amp;lt;code&amp;gt;org.example.utility.package&amp;lt;/code&amp;gt;. Tato direktiva zaručí, že kterýkoli jiný modul importující balíček &amp;lt;code&amp;gt;org.example.bundle.package&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;org.example.utility.package&amp;lt;/code&amp;gt; uvidí stejnou verzi &amp;lt;code&amp;gt;org.example.utility.package&amp;lt;/code&amp;gt; jako tento modul. Vhodný nástroj (například [[Eclipse PDE]]) dokáže tyto direktivy automaticky počítat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''Import-Package:'''&amp;lt;/code&amp;gt; Exportováním balíčku dává modul možnost ostatním modulům využívat třídy definované v daném balíčku. Aby je však ostatní jiný modul mohl využívat, musí je explicitně importovat. Tato hlavička říká, že tento ukázkový modul využívá balíček &amp;lt;code&amp;gt;org.example.utility.package&amp;lt;/code&amp;gt;. Pokud v ''OSGi'' kontejneru není přítomný žádný modul exportující daný balíček s potřebnou verzí, nebude možné tento modul použít. Verze je v tomto případě uvedená rozsahem (od &amp;lt;code&amp;gt;1.4.0&amp;lt;/code&amp;gt; včetně do &amp;lt;code&amp;gt;2.0.0&amp;lt;/code&amp;gt; vyjma). Verze &amp;lt;code&amp;gt;1.4.0&amp;lt;/code&amp;gt; je zřejmě verzí, proti které byl ukázkový modul vyvíjen a jeho autor zároveň vyjadřuje důvěru, že až do verze &amp;lt;code&amp;gt;2.0.0&amp;lt;/code&amp;gt; daného balíčku bude použité API zpětně kompatibilní. V případě více dostupných verzí bude pro tento modul viditelná nejvyšší verze balíčku vyhovující rozsahu a zároveň nezpůsobující konflikty s ostatními importy a omezeními.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''Require-Bundle:'''&amp;lt;/code&amp;gt; Zatímco importování balíčku nevytváří „tvrdou závislost“ na jakémkoliv jiném konkrétním modulu (je jedno, který modul potřebný balíček v dané verzi exportuje), tato hlavička udává přímou závislost na konkrétně uvedeném modulu. Dochází k importu všech exportovaných balíčků uvedeného modulu. Doporučuje se pokud možno používat pouze &amp;lt;code&amp;gt;Import-Package&amp;lt;/code&amp;gt; hlavičky, kterými lze udržet minimální rozsah závislostí a předcházet tak konfliktům.&lt;br /&gt;
&lt;br /&gt;
=== Životní cyklus ===&lt;br /&gt;
Každý ''OSGi'' modul prochází dobře definovaným životním cyklem. Pokud není ''Frameworkem'' spravován, nachází se ve stavu ''uninstalled'', po instalaci do ''Frameworku'' se nachází ve stavu ''installed'' a je učiněn pokus o uspokojení jeho závislostí definovaných hlavičkami &amp;lt;code&amp;gt;Import-Package&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;Require-Bundle&amp;lt;/code&amp;gt;. Pokud jsou tyto závislosti uspokojeny, přechází modul do stavu ''resolved'', ve kterém jsou již jím exportované balíčky dostupné ostatním modulům. Pokud závislosti modulu nelze v dané chvíli uspokojit, zůstává ve stavu ''installed'' a po instalaci dodatečných modulů může být zopakován pokus o uspokojení jeho závislostí.&lt;br /&gt;
&lt;br /&gt;
Ze stavu resolved může být modul nastartován – je zavolána metoda ''start'' jeho aktivátoru, pokud nějaký definuje. Při zpracování této metody se nachází ve stavu ''starting''. Pakliže metoda nevyhodí žádnou výjimku, dostává se do stavu ''active'', ve kterém zůstává až do doby jeho zastavení voláním metody stop aktivátoru. O startování a zastavování modulů se může starat jednak ''Framework'' sám, jednak může být vyvoláno (stejně jako ostatní operace životního cyklu) z konzole a mohou je iniciovat ostatní moduly (pokud to umožňuje bezpečnostní nastavení).&lt;br /&gt;
&lt;br /&gt;
Operace ''update'' může být použita k aktualizování modulu na vyšší verzi či zopakování procesu uspokojení závislostí, stejně jako operace ''refresh'', která navíc způsobí update všech modulů závislých na daném refreshovaném modulu.&lt;br /&gt;
&lt;br /&gt;
=== Služby ===&lt;br /&gt;
Importy a exporty balíčků definují statické závislosti mezi moduly. ''OSGi'' navíc nabízí vrstvu služeb, které tvoří dynamické závislosti. Služba v ''OSGi'' je libovolný [[POJO]] objekt. Může být zaregistrován kdykoliv je modul ve stavu ''starting'' nebo ''active''. Registrace se provádí pod názvem jednoho či více rozhraní, které daný objekt implementuje, a libovolného počtu atributů klíč-hodnota pro odlišení služeb stejného typu. Po registraci může být služba nalezena ostatními moduly v registru na základě názvu rozhraní a [[LDAP]] filtru přes další atributy. Modul může zaregistrovat posluchače &amp;lt;code&amp;gt;ServiceListener&amp;lt;/code&amp;gt; na službu, která zatím není dostupná a čekat na její registraci.&lt;br /&gt;
&lt;br /&gt;
V průběhu času mohou přicházet nové služby s tím, jak se do kontejneru instalují nové moduly. Existující služby mohou být také odregistrovány – děje se tak buď programově, nebo automaticky při zastavení modulu, který je zaregistroval. Toto dynamické chování klade specifické nároky na klientský kód, který služeb využívá. Správné použití služeb přes nativní ''OSGi'' [[API]] je poměrně složité a obnáší množství opakujícího se kódu. K dispozici je několik nadstaveb usnadňující práci se službami – například knihovna ''Spring Dynamic Modules'' [http://www.springsource.org/osgi], která umožňuje definovat pro každý modul springový aplikační kontext, deklarativně exportovat beany jako služby a importovat libovolnou službu jako [[Spring Framework|Spring]] [[Java Bean|bean]]. Vytvořený bean je proxy objektem k požadované službě, umožňujícím například dynamickou záměnu za ekvivalentní službu, pokud je původní služba odregistrována.&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Článek z Wikipedie}}&lt;br /&gt;
[[Kategorie:Java]]&lt;/div&gt;</summary>
		<author><name>Sysop</name></author>	</entry>

	</feed>