OSGi atvieglo moduļu Java komponentu (sauktu saišķi), ko var izvietot konteinerā. Kā izstrādātājs jūs izmantojat OSGi specifikāciju un rīkus, lai izveidotu vienu vai vairākus saišķus. OSGi nosaka šo paku dzīves ciklu. Tas arī viņus uzņem un atbalsta viņu mijiedarbību konteinerā. Jūs varat iedomāties OSGi konteineru, kas ir aptuveni līdzīgs JVM, ar papildu pilnvarām. Tāpat domājiet par saišķiem kā Java lietojumprogrammām ar unikālām spējām. Komplekti darbojas OSGi konteinerā kā klienta un servera komponenti.
OSGi alianse
OSGi sākās 1999. gadā, un atšķirībā no daudzām citām specifikācijām standartu nepārvalda Oracle, Java Community Process vai Eclipse Foundation. Tā vietā to pārvalda OSGi alianse.
Ar ko OSGi atšķiras
OSGi filozofija atšķiras no citiem Java balstītajiem ietvariem, it īpaši Spring. OSGi vienā konteinerā var pastāvēt vairākas lietojumprogrammas: OSGi paketes izpildlaika vide. Konteiners nodrošina, ka katrs komponents ir pietiekami izolēts, un tam ir arī piekļuve visām nepieciešamajām atkarībām. OSGi var atbalstīt atkarības ievadīšanu, ko standartizē Auns Blueprint projekts. Papildus OSGi vadības inversijas (IoC) konteinera nodrošināšanai Auns atbalsta standarta Java ietvarus, piemēram, Java Persistence API (JPA).
OSGi paketes var atklāt pakalpojumus, kurus citi paketes izmanto. Komplekts var arī deklarēt versiju un noteikt, no kādiem citiem komplektiem tas ir atkarīgs. Pēc tam izpildlaiks automātiski ielādēs visus komplektus atkarības secībā. OSGi vienā un tajā pašā komplektā var pastāvēt vairākas versijas, ja to prasa paketes atkarības.
OSGi Eclipse IDE un Equinox
OSGi kaut kādā formā pastāv jau pāris gadu desmitus. To izmanto daudzām labi zināmām lietojumprogrammām, sākot no iegultām mobilajām ierīcēm līdz lietojumprogrammu serveriem un IDE.
Populārais Eclipse IDE ir uzbūvēts virs OSGi. Eclipse OSGi konteinera ieviešanu sauc par Equinox. Tas ir lielisks piemērs OSGi izpratnei. Pamatojoties uz OSGi, Equinox ir modulāra platforma. Tajā mitināti dažādi pakalpojumi, kurus izstrādātāji var pievienot pēc vēlēšanās. Katrs no tiem piedāvā iespēju, kas izstrādātājam varētu būt nepieciešama viņu IDE. Varat pievienot Java un JavaScript redaktorus, lietotņu serveri un datu bāzes savienotāju. Katrs no tiem tiek ieviests kā OSGi pakete, kas tiek pievienota konteineram un var mijiedarboties ar citiem konteinera pakalpojumiem.
Nesen ir pieaugusi interese par OSGi lietisko lietu internetam (IoT) izmantošanu. OSGi ir dabiski piemērota šāda veida attīstībai, kurai ir dažādas programmatūras sastāvdaļas, kas ierīcēs darbojas blakus, ne vienmēr zinot par otru. OSGi konteiners nodrošina vienkāršu un standartizētu veidu, kā mitināt šos dinamiskos programmatūras komponentus.
OSGi izmantošana Java projektā: Knoplerfish OSGi
Mēs strādāsim ar lietojumprogrammas piemēru, kas OSGi koncepcijas padarīs konkrētākas. Mūsu piemērs ir balstīts uz Knoplerfish OSGi izpildlaiku, kas tiek izmantots daudzos ražošanas izvietojumos. Knoplerfish ietver GUI un komandrindas saskarni (CLI) OSGi konteinera un tā saišu pārvaldīšanai.
Vispirms jūs lejupielādēsit Knoplerfish. Pašreizējā versija šī raksta tapšanas laikā ir Knoplerfish OSGi 6.1.3. Lasot šo rakstu, varat aizstāt šo versiju ar visu jaunāko.
Pēc Knoplerfish lejupielādes un instalēšanas izmantojiet CLI, lai nomestu direktorijā, kurā lejupielādējāt JAR failu, un ievadiet: java -jar framework.jar
. Tas palaidīs izpildāmo JAR, un jūs vajadzētu sveikt ar GUI logu.
Knoplerfish OSGi GUI
Sākumā Knoplerfish OSGi GUI var šķist milzīgs, taču pamati ir vienkārši:
- Ekrāna augšdaļā ir izvēlne.
- Kreisajā pusē ir pakete, kas ir ielādēta izpildlaikā.
- Pa labi ir informācijas logs.
- Apakšā ir teksta izvades konsole.
- Pašā apakšā ir ievades konsole.
Tips palīdzība
ievades konsolē, ja vēlaties redzēt palīdzības opcijas.
Pirms mēs pārietam uz piemēru, ieskatieties skriešanas saišķu komplektā. Jūs redzēsiet saiti, ko sauc HTTP serveris
, kas nozīmē, ka pakete, kurā darbojas HTTP serveris, ir izveidots. Atveriet pārlūkprogrammu un pārbaudiet vietni // localhost: 8080. Protams, jūs redzēsiet Knoplerfish tīmekļa lapu.
“Hello JavaWorld” pakete
Izmantosim OSGi izpildlaiku, lai izveidotu vienkāršu paketi, kuru es sauktu Sveiki JavaWorld
. Šī pakete izsūta ziņojumu konsolei.
1. sarakstā mēs izmantojam Maven, lai izveidotu saišķi. Tam ir tikai viena atkarība, ko nodrošina OSGi alianse.
Uzskaitījums 1. OSGi atkarība no Maven POM
org.osgi org.osgi.core
Tagad mēs izmantosim arī spraudni, pateicoties Apache Felix projektam. Šis spraudnis rūpējas par lietotnes iesaiņošanu kā OSGi paketi lietošanai. 2. saraksts parāda konfigurāciju, kuru izmantosim.
2. OSGi Felix spraudnis Maven POM sarakstā
org.apache.felix maven-bundle-plugin true org.javaworld.osgi org.javaworld.osgi Sveiki
Tagad mēs varam apskatīt vienkāršo klasi, kas izdos “Hello”.
Saraksts 3. Sveiki JavaWorld OSGi pakete
pakete com.javaworld.osgi; importēt org.osgi.framework.BundleActivator; importēt org.osgi.framework.BundleContext; publiskā klase HelloJavaWorld ievieš BundleActivator {public void start (BundleContext ctx) {System.out.println ("Hello JavaWorld."); } public void stop (BundleContext bundleContext) {}}
Izveidojiet paketi, dodoties uz komandrindu un ierakstot mvn tīra instalēšana
. Tādējādi tiks izvadīts JAR fails ar paketi. Tagad dodieties uz Fails
izvēlnē Knoplerfish GUI un atlasiet Pievienojiet paketi
. Tas nodrošinās failu pārlūku. Atrodiet tikko izveidoto JAR un atlasiet to.
Konteinerā esošo OSGi saišu pārvaldīšana
Knoplerfish lietotāja saskarnes izvades logā redzēsiet ziņojumu “Sveiki, JavaWorld”. Noklikšķiniet uz komplekta Knoplerfish GUI, un jūs varat redzēt ID, kuru konteiners tam ir piešķīris. Kad esat gatavs apturēt paketi, varat noklikšķināt uz izvēlnes vienuma Apturēt. Vēl viens veids ir iekļūt stop [saišķa numurs]
komandrindā. Konteinerā esošos saišķus var pārvaldīt, izmantojot GUI vai komandrindu.
Tagad jūs saprotat, kā vienkāršs saišķis darbojas OSGi konteinerā. Visur, kur eksistē OSGi konteiners, saišķu palaišanā un apturēšanā jūs atradīsit tādu pašu vienkāršību. OSGi rada paketes vidi un dzīves ciklu.
Paketes mijiedarbība: pakalpojumi un klienti
Tālāk mēs aplūkosim, kā saišķi savstarpēji sazinās.
Vispirms mēs izveidosim pakalpojumu pakete. Pakalpojuma pakete ir analoga EJB sesijas pupiņai: tā nodrošina komponentu, kuram citi attēli var piekļūt, izmantojot attālo saskarni. Lai izveidotu pakalpojumu paketi, mums jānodrošina gan saskarne, gan ieviešanas klase.
Uzskaitījums 4. Pakalpojuma paketes saskarne
pakete com.javaworld.osgi.service; publiskā saskarne WhatIsOsgi {public Integer addNum (Integer x, Integer y); }
4. saraksts ir vienkāršs interfeiss. Vienīgā metode ir a addNum ()
metode, kas darīs to, ko tas nozīmē: atgrieziet divu skaitļu pievienošanu. 5. sarakstā redzamā ieviešana ir vienlīdz vienkārša, taču tajā tiek pievienotas pāris OSGi specifiskas metodes.
Saraksts 5. Pakalpojuma paketes ieviešana
pakete com.javaworld.osgi.service; publiskā klase WhatIsOsgiImpl īsteno WhatIsOsgi, BundleActivator {private ServiceReference ref; privātā ServiceRegistration reg; @Override public Integer addNum (Integer x, Integer y) {return x + y; } @Orride public void start (BundleContext context) izmet izņēmumu {reg = context.registerService (WhatIsOsgi.class, new WhatIsOsgiImpl (), new Hashtable ()); ref = reg.getReference (); } @Orride public void stop (BundleContext context) izmet izņēmumu {reg.unregister (); }}
Apskatīsim tuvāk to, kas notiek 5. sarakstā:
publiskā klase WhatIsOsgiImpl īsteno WhatIsOsgi, BundleActivator
: Šeit mēs ieviešam mūsu izveidoto saskarni. Ņemiet vērā, ka mēs arī ieviešamBundleActivator
interfeisu, kā mēs to darījām arSveikiJavaWorld
piemērs. Pēdējais ir tāpēc, ka šis saišķis pats sevi aktivizēs.privāts ServiceReference ref; privātā ServiceRegistration reg;
: Tie ir attiecīgi mainīgie mainīgajiem OSGi reģistrācijas pakalpojumam un šī pakalpojuma paketes atsaucei.public Integer addNum (Integer x, Integer y)
: Šī ir vienkārša pievienošanas metodes ieviešana.public void start (BundleContext konteksts)
: Šī sākuma metode ir daļa noBundleActivator
interfeisu, un to izpilda konteiners. Šajā piemērā mēs iegūstam atsauci uz OSGi reģistrācijas pakalpojumu un izmantojam to savamKasIsOsgi
saskarne un ieviešana. TukšaisHashtable
ir paredzēts konfigurācijas parametriem, kurus mēs šeit neizmantojam. Mēs arī iegūstam atsauci uz tikko izveidoto pakalpojumu.public void stop (BundleContext konteksts)
: Šeit mēs vienkārši reģistrējam pakalpojumu. Šis vienkāršais pakalpojums vienkārši pārvalda vissliktākos tā dzīves cikla elementus. Tās galvenais mērķis ir atklātaddNum
metodi OSGi konteineram.
OSGi klients
Tālāk uzrakstīsim klientu, kurš var izmantot pakalpojumu. Šis klients atkal izmantos BundleActivator
interfeiss. Tas arī pievienos ServiceListener
saskarni, kā parādīts 6. sarakstā.
Uzskaitījums 6. OSGi pakalpojuma klienta pakete
publiskā klase OsgiClient īsteno BundleActivator, ServiceListener {private BundleContext ctx; privāts ServiceReference pakalpojums; public void start (BundleContext ctx) {this.ctx = ctx; mēģiniet {ctx.addServiceListener (this, "(objectclass =" + WhatIsOsgi.class.getName () + ")"); } catch (InvalidSyntaxException ise) {ise.printStackTrace (); }}}
6. sarakstā ir sākuma metode, kas pievienos pakalpojumu klausītāju. Šis klausītājs tiek filtrēts pēc pakalpojuma klases nosaukuma, kuru izveidojām 5. sarakstā. Kad pakalpojums tiks atjaunināts, tas izsauks serviceChanged ()
metodi, kā parādīts 7. sarakstā.
Sarakstā 7. serviceChanged metode
public void serviceChanged (ServiceEvent event) {int type = event.getType (); slēdzis (tips) {gadījums (ServiceEvent.REGISTERED): serviceReference = event.getServiceReference (); Apsveikuma pakalpojums = (Sveicējs) (ctx.getService (pakalpojums)); System.out.println ("Pievienojot 10 un 100:" + service.addNum (10, 100)); pārtraukums; gadījums (ServiceEvent.UNREGISTERING): System.out.println ("Pakalpojums nav reģistrēts."); ctx.ungetService (event.getServiceReference ()); // Izlaiž atsauci uz pakalpojumu, lai to varētu izjaukt GC'd; noklusējums: pārtraukums; }}
Ņemiet vērā, ka serviceChanged
metodi izmanto, lai noteiktu, kāds notikums ir noticis pakalpojumam, kas mūs interesē. Pēc tam pakalpojums atbildēs, kā norādīts. Šajā gadījumā, kad REĢISTRĒTS
parādās notikums, mēs izmantojam addNum ()
metodi.
OSGi alternatīva
Šis ir ātrs ievads OSGi, Open Services Gateway Initiative. Kā redzējāt Knoplerfish piemērā, OSGi nodrošina izpildlaika vidi, kurā varat definēt modulārus Java komponentus (saišķus). Tas nodrošina noteiktu paketes mitināšanas klienta dzīves ciklu un atbalsta paketes, kas mijiedarbojas kā klienti un konteinera pakalpojumi. Visas šīs iespējas kopā piedāvā interesantu alternatīvu standarta Java izpildlaikiem un ietvariem, īpaši mobilajām un IoT lietojumprogrammām.
Visbeidzot, ņemiet vērā, ka iepriekšējā sērijas “Kas ir: Java” rakstā tika ieviesta Java platformas moduļu sistēma, kas piedāvā atšķirīgu pieeju tam pašam Java modularitātes izaicinājumam.
Šo stāstu "Kas ir OSGi? Atšķirīga pieeja Java modularitātei" sākotnēji publicēja JavaWorld.