OSGi helpottaa modulaaristen Java-komponenttien (kutsutaan) luomista ja hallintaa niput), jotka voidaan sijoittaa konttiin. Kehittäjänä luot OSGi-määrityksen ja työkalut yhden tai useamman nipun luomiseen. OSGi määrittelee näiden nippujen elinkaaren. Se myös isännöi heitä ja tukee heidän vuorovaikutustaan kontissa. Voit ajatella, että OSGi-säiliö on suunnilleen analoginen JVM: n kanssa, lisävoimilla. Ajattele myös paketteja Java-sovelluksina, joilla on ainutlaatuiset kyvyt. Niput toimivat OSGi-säilön sisällä asiakas- ja palvelinkomponenteina.
OSGi-liittouma
OSGi alkoi vuonna 1999, ja toisin kuin monet muut tekniset tiedot, standardia ei hallinnoi Oracle, Java Community Process tai Eclipse Foundation. Sen sijaan sitä hallinnoi OSGi-allianssi.
Kuinka OSGi on erilainen
OSGin filosofia eroaa muiden Java-pohjaisten kehysten, etenkin Springin, filosofiasta. OSGi: ssä voi olla useita sovelluksia samassa säilössä: OSGi-paketin ajonaikainen ympäristö. Säiliö varmistaa, että jokainen komponentti on riittävän eristetty, ja sillä on myös pääsy kaikkiin tarvitsemiinsa riippuvuuksiin. OSGi tukee Aries Blueprint -projektin standardoimaa riippuvuusinjektiota. Sen lisäksi, että Aries tarjoaa OSGi: n inversio ohjausobjektin (IoC) -säiliön, Aries tukee tavallisia Java-kehyksiä, kuten Java Persistence API (JPA).
OSGissä niput voivat paljastaa palveluja, joita muut niput käyttävät. Nippu voi myös ilmoittaa version ja määrittää, mistä muista nippuista se riippuu. Ajonaika lataa sitten kaikki niput automaattisesti riippuvuusjärjestyksessä. OSGissä saman paketin useita versioita voi olla rinnakkain, jos pakettiriippuvuudet sitä edellyttävät.
OSGi Eclipse IDE: ssä ja Equinoxissa
OSGi on ollut jossain muodossa pari vuosikymmentä. Sitä käytetään monissa tunnetuissa sovelluksissa, upotetuista mobiililaitteista sovelluspalvelimiin ja IDE: iin.
Suosittu Eclipse IDE on rakennettu OSGin päälle. Eclipsen OSGi-kontin toteuttamista kutsutaan Equinoxiksi. Se on hieno esimerkki OSGin ymmärtämisestä. OSGi-pohjainen tarkoittaa, että Equinox on modulaarinen alusta. Se isännöi erilaisia palveluja, joita kehittäjät voivat lisätä halunsa mukaan. Jokainen näistä tarjoaa kyvyn, jota kehittäjä saattaa tarvita IDE: ssä. Voit lisätä Java- ja JavaScript-editorit, sovelluspalvelimen ja tietokantaliittimen. Jokainen näistä on toteutettu OSGi-pakettina, joka lisätään säilöön ja voi olla vuorovaikutuksessa muiden säilössä olevien palveluiden kanssa.
Viime aikoina OSGi: n käyttö esineiden internetissä on ollut kiinnostunut. OSGi sopii luonnollisesti tämäntyyppiseen kehitykseen, jossa on useita ohjelmistokomponentteja, jotka kulkevat rinnakkain laitteissa, tietämättä toisistaan. OSGi-kontti tarjoaa yksinkertaisen ja standardoidun tavan isännöidä näitä dynaamisia ohjelmistokomponentteja.
OSGin käyttö Java-projektissa: Knoplerfish OSGi
Työskentelemme esimerkkisovelluksen avulla, joka tekee OSGi-käsitteistä konkreettisempia. Esimerkkimme perustuu Knoplerfish OSGi -ajoon, jota käytetään monissa tuotantoympäristöissä. Knoplerfish sisältää käyttöliittymän ja komentoriviliittymän (CLI) OSGi-kontin ja sen nippujen hallintaan.
Ensimmäinen asia, jonka teet, on ladata Knoplerfish. Tämänhetkinen versio kirjoitushetkellä on Knoplerfish OSGi 6.1.3. Voit korvata kyseisen version kaikilla uusimmilla, kun luet tätä artikkelia.
Kun olet ladannut ja asentanut Knoplerfishin, pudota CLI: llä hakemistoon, johon latasit JAR-tiedoston, ja kirjoita: java -jar framework.jar
. Se suorittaa suoritettavan JAR: n, ja sinua tulisi tervehtiä GUI-ikkunalla.
Knoplerfish OSGi -käyttöliittymä
Knoplerfish OSGin käyttöliittymä voi aluksi tuntua ylivoimaiselta, mutta perusasiat ovat yksinkertaiset:
- Ruudun yläosassa on valikko.
- Vasemmalla on joukko nippuja, jotka on ladattu ajonaikaan.
- Oikealla on tietoikkuna.
- Alareunassa on tekstinsyöttökonsoli.
- Alaosassa on tulokonsoli.
Tyyppi auta
tulokonsoliin, jos haluat nähdä ohjevaihtoehdot.
Ennen kuin siirrymme esimerkkiin, tutustu käynnissä olevien nippujen sarjaan. Näet paketin nimeltä HTTP-palvelin
, mikä tarkoittaa, että HTTP-palvelinta käyttävä nippu on päällä. Siirry selaimeesi ja tarkista // localhost: 8080. Tosiaan, näet Knoplerfish-verkkosivun.
Hello JavaWorld -paketti
Rakennetaan OSGi-ajonaikana yksinkertainen paketti, jota kutsun Hei JavaWorld
. Tämä paketti lähettää viestin konsolille.
Luettelossa 1 käytämme nippua Mavenin avulla. Sillä on vain yksi riippuvuus, jonka tarjoaa OSGi-liittouma.
Luettelo 1. OSGi-riippuvuus Maven POM: ssa
org.osgi org.osgi.core
Aiomme nyt käyttää myös laajennusta Apache Felix -projektin avulla. Tämä laajennus huolehtii sovelluksen pakkaamisesta OSGi-nipuksi käytettäväksi. Listaus 2 näyttää käytetyn kokoonpanon.
Luettelo 2. OSGi Felix -laajennus Maven POM: ssa
org.apache.felix maven-bundle-plugin true org.javaworld.osgi org.javaworld.osgi.Hei
Nyt voimme tarkastella yksinkertaista luokkaa, joka tuottaa "Hello".
Listaus 3. Hei JavaWorld OSGi -paketti
paketti com.javaworld.osgi; tuo org.osgi.framework.BundleActivator; tuo org.osgi.framework.BundleContext; public class HelloJavaWorld toteuttaa BundleActivator {public void start (BundleContext ctx) {System.out.println ("Hello JavaWorld."); } public void stop (BundleContext bundleContext) {}}
Rakenna paketti siirtymällä komentoriville ja kirjoittamalla mvn puhdas asennus
. Tämä tuottaa JAR-tiedoston, joka sisältää paketin. Mene nyt Tiedosto
valikko Knoplerfish-käyttöliittymässä ja valitse Lisää paketti
. Tämä tarjoaa tiedostoselaimen. Etsi juuri rakentama JAR ja valitse se.
OSGi-pakettien hallinta säilössä
Knoplerfish-käyttöliittymän lähtöikkunassa näet "Hello, JavaWorld" -viestisi. Napsauta nippua Knoplerfish-käyttöliittymässä ja näet sen tunnisteen, jonka säilö on sille määrittänyt. Kun olet valmis pysäyttämään paketin, voit napsauttaa Pysäytä-valikkokohtaa. Toinen tapa on päästä sisään lopeta [nipun numero]
komentorivillä. Voit hallita paketteja säiliössä joko käyttöliittymän tai komentorivin avulla.
Nyt sinulla on käsitys siitä, kuinka yksinkertainen paketti toimii OSGi-kontissa. Missä tahansa OSGi-kontissa on, löydät saman yksinkertaisuuden nippujen käynnistämisessä ja lopettamisessa. OSGi luo ympäristön ja elinkaaren paketille.
Bundle Interactions: Palvelut ja asiakkaat
Seuraavaksi tarkastelemme, kuinka niput kommunikoivat keskenään.
Ensimmäinen asia, jonka teemme, on luoda palvelupaketti. Palvelupaketti on analoginen EJB-istuntoobean kanssa: Se tarjoaa komponentin, johon muut niput voivat päästä etärajapinnan kautta. Palvelupaketin luomiseksi meidän on annettava sekä käyttöliittymä että toteutusluokka.
Luettelo 4. Palvelupaketin käyttöliittymä
paketti com.javaworld.osgi.service; julkinen käyttöliittymä WhatIsOsgi {public Integer addNum (kokonaisluku x, kokonaisluku y); }
Listaus 4 on yksinkertainen käyttöliittymä. Ainoa menetelmä on a addNum ()
menetelmä, joka tekee mitä tarkoittaa: palauttaa kahden numeron lisäämisen. Listauksessa 5 esitetty toteutus on yhtä yksinkertainen, mutta lisää muutaman OSGi-spesifisen menetelmän.
Listaus 5. Palvelupaketin toteutus
paketti com.javaworld.osgi.service; julkinen luokka WhatIsOsgiImpl toteuttaa WhatIsOsgi, BundleActivator {private ServiceReference ref; yksityinen ServiceRegistration-rekisteri; @Override public Integer addNum (kokonaisluku x, kokonaisluku y) {return x + y; } @Override public void start (BundleContext context) heittää Exception {reg = context.registerService (WhatIsOsgi.class, new WhatIsOsgiImpl (), new Hashtable ()); viite = reg.getReference (); } @Override public void stop (BundleContext context) heittää poikkeuksen {reg.unregister (); }}
Katsotaanpa tarkemmin, mitä listalla 5 tapahtuu:
julkinen luokka WhatIsOsgiImpl toteuttaa WhatIsOsgi, BundleActivator
: Tässä toteutamme luomamme käyttöliittymän. Huomaa, että toteutamme myösBundleActivator
käyttöliittymä, kuten teimmeHeiJavaWorld
esimerkki. Jälkimmäinen johtuu siitä, että tämä paketti aktivoituu itsestään.yksityinen ServiceReference ref; yksityinen ServiceRegistration-rekisteri;
: Nämä ovat muuttujia OSGi-rekisteröintipalvelulle ja tämän palvelun nippuviittaukseksi.public Integer addNum (kokonaisluku x, kokonaisluku y)
: Tämä on add-menetelmän yksinkertainen toteutus.public void start (BundleContext-konteksti)
: Tämä aloitusmenetelmä on osaBundleActivator
käyttöliittymä, ja sen suorittaa säiliö. Tässä esimerkissä saamme viitteen OSGi-rekisteröintipalveluun ja sovellamme sitä omaanMitäIsOsgi
käyttöliittymä ja toteutus. TyhjäHashtable
on konfigurointiparameille, joita emme käytä tässä. Saamme myös viittauksen juuri luomaamme palveluun.public void stop (BundleContext-konteksti)
: Tässä me yksinkertaisesti peruutamme palvelun rekisteröinnin. Tämä yksinkertainen palvelu hallitsee vain sen elinkaaren kaikkein vaikeimpia osia. Sen päätarkoitus on paljastaaaddNum
menetelmä OSGi-säiliöön.
OSGi-asiakas
Seuraavaksi kirjoitetaan asiakas, joka voi käyttää palvelua. Tämä asiakas käyttää uudelleen BundleActivator
käyttöliittymä. Se lisää myös ServiceListener
käyttöliittymä, kuten luettelossa 6 on esitetty.
Listaus 6. OSGi-palvelun asiakaspaketti
julkinen luokka OsgiClient toteuttaa BundleActivator, ServiceListener {private BundleContext ctx; yksityinen ServiceReference-palvelu; public void start (BundleContext ctx) {this.ctx = ctx; kokeile {ctx.addServiceListener (tämä, "(objectclass =" + WhatIsOsgi.class.getName () + ")"); } catch (InvalidSyntaxException ise) {ise.printStackTrace (); }}}
Listalla 6 on aloitusmenetelmä, joka lisää palvelun kuuntelijan. Tämä kuuntelija suodatetaan luettelossa 5 luomamme palvelun luokan nimen perusteella. Kun palvelu päivitetään, se soittaa serviceChanged ()
menetelmä, kuten luettelossa 7 on esitetty.
Listaus 7. serviceChanged-menetelmä
public void serviceChanged (ServiceEvent event) {int type = event.getType (); kytkin (tyyppi) {tapaus (ServiceEvent.REGISTERED): serviceReference = event.getServiceReference (); Tervehdyspalvelu = (Tervehdys) (ctx.getService (palvelu)); System.out.println ("Lisätään 10 ja 100:" + service.addNum (10, 100)); tauko; tapaus (ServiceEvent.UNREGISTERING): System.out.println ("Palvelua ei ole rekisteröity."); ctx.ungetService (event.getServiceReference ()); // Julkaisee viittauksen palveluun, jotta se voi olla GC'd break; oletus: tauko; }}
Huomaa, että serviceChanged
menetelmää käytetään määrittämään, mikä tapahtuma on tapahtunut kiinnostavalle palvelulle. Palvelu vastaa sitten määritetyllä tavalla. Tässä tapauksessa, kun Rekisteröitynyt
tapahtuma ilmestyy, käytämme addNum ()
menetelmä.
OSGi-vaihtoehto
Tämä on ollut nopea esittely OSGiin, Open Services Gateway Initiative -ohjelmaan. Kuten olet nähnyt Knoplerfish-esimerkin kautta, OSGi tarjoaa ajonaikaisen ympäristön, jossa voit määrittää modulaariset Java-komponentit (niput). Se tarjoaa määritetyn elinkaaren nippujen isännöimiseksi asiakkaassa ja tukee nippuja, jotka ovat vuorovaikutuksessa asiakkaina ja palveluina säilössä. Kaikki nämä ominaisuudet yhdessä tarjoavat mielenkiintoisen vaihtoehdon tavallisille Java-ajoille ja kehyksille, erityisesti mobiili- ja IoT-sovelluksille.
Lopuksi on huomattava, että "Mikä on: Java" -sarjan edellinen artikkeli esitteli Java Platform Module System -järjestelmän, joka tarjoaa erilaisen lähestymistavan samaan Java-modulaarisuuden haasteeseen.
Tämän tarinan "Mikä on OSGi? Eri lähestymistapa Java-modulaarisuuteen" julkaisi alun perin JavaWorld.