Ohjelmointi

Mikä on JPMS? Esittelyssä Java Platform Module System

Java 9: ​​ään asti paketti oli ollut Java: n ylätason koodijärjestelyelementti. Alkaen Java 9: ​​stä, joka muuttui: moduuli on nyt paketin yläpuolella. Moduuli kerää siihen liittyvät paketit yhdessä.

Java Platform Module System (JPMS) on kooditasoinen rakenne, joten se ei muuta sitä, että pakataan Java JAR-tiedostoiksi. Viime kädessä kaikki on edelleen niputettu yhteen JAR-tiedostoissa. Moduulijärjestelmä lisää uuden, korkeamman tason kuvaajan, jota JAR: t voivat käyttää sisällyttämällä module-info.java tiedosto.

Suuret sovellukset ja organisaatiot hyödyntävät moduuleja järjestääkseen koodin paremmin. Mutta kaikki kuluttavat moduuleja, koska JDK ja sen luokat ovat nyt moduloituja.

Miksi Java tarvitsee moduuleja

JPMS on tulos Jigsaw-projektista, joka toteutettiin seuraavilla ilmoitetuilla tavoitteilla:

  • Helpota kehittäjien suurten sovellusten ja kirjastojen järjestämistä
  • Paranna alustan ja itse JDK: n rakennetta ja turvallisuutta
  • Paranna sovelluksen suorituskykyä
  • Parempi käsittely alustan hajoamisessa pienemmille laitteille

On syytä huomata, että JPMS on SE (Standard Edition) -ominaisuus ja vaikuttaa siten kaikkiin Java-osa-alueisiin alusta asti. Tämän sanottuaan muutos on suunniteltu sallimaan suurin osa koodi toimimaan ilman muutoksia siirryttäessä Java 8: sta Java 9: ​​een. Tähän on joitain poikkeuksia, ja huomaamme ne myöhemmin tässä yleiskatsauksessa.

Moduulin pääajatuksena on sallia moduulille näkyvien liittyvien pakettien kerääminen piilottaen elementit moduulin ulkoisilta kuluttajilta. Toisin sanoen moduuli sallii toisen kapselointitason.

Luokan polku vs. moduulin polku

Jaavassa toistaiseksi luokan polku on ollut käynnissä olevan sovelluksen käytettävissä olevan rivin alarivi. Vaikka luokan polku palvelee tätä tarkoitusta ja on hyvin ymmärretty, se on lopulta iso, erittelemätön ämpäri, johon kaikki riippuvuudet sijoitetaan.

Moduulin polku lisää tason luokkapolun yläpuolelle. Se toimii pakettien säilönä ja määrittää, mitkä paketit ovat sovelluksen käytettävissä.

JDK: n moduulit

JDK itse koostuu moduuleista. Aloitetaan katsomalla JPMS: n muttereita ja pultteja siellä.

Jos järjestelmässäsi on JDK, sinulla on myös lähde. Jos et tunne JDK: ta ja miten se hankitaan, tutustu tähän artikkeliin.

JDK-asennushakemistosi sisällä on / lib hakemistoon. Hakemiston sisällä on src.zip tiedosto. Pura se a / src hakemistoon.

Katso / src hakemistoon ja siirry /java.base hakemistoon. Sieltä löydät module-info.java tiedosto. Avaa se.

Javadoc-kommenttien jälkeen löydät osion nimeltämoduuli java.base jota seuraa sarja vienti linjat. Emme pysy tässä muodossa, koska siitä tulee melko esoteerinen. Yksityiskohdat löytyvät täältä.

Voit nähdä, että monet tuttuista Java-paketeista, kuten java.io, viedään java.base moduuli. Tämä on paketin kokoamisen moduulin ydin.

Kääntöpuolivienti on vaatii ohje. Tämä sallii määriteltävän moduulin vaativan moduulin.

Kun suoritat Java-kääntäjän moduuleja vastaan, määrität moduulin polun samalla tavalla kuin luokan polku. Tämä mahdollistaa poissaolojen ratkaisemisen.

Modulaarisen Java-projektin luominen

Katsotaanpa, kuinka moduloitu Java-projekti rakentuu.

Teemme pienen ohjelman, jossa on kaksi moduulia, joista toinen toimittaa riippuvuuden ja toinen käyttää sitä ja vie suoritettavan pääluokan.

Luo uusi hakemisto johonkin kätevään tiedostojärjestelmääsi. Kutsu sitä /com.javaworld.mod1. Yleensä Java-moduulit elävät hakemistossa, jolla on sama nimi kuin moduulilla.

Luo nyt tämän hakemiston sisällä a module-info.java tiedosto. Lisää sisälle sisältö luettelosta 1.

Listaus 1: com.javaworld.mod1 / module-info.java

moduuli com.javaworld.mod1 {vie com.javaworld.package1; }

Huomaa, että moduuli ja sen viemä paketti ovat eri nimiä. Määritämme moduulin, joka vie paketin.

Luo nyt tiedosto tälle polulle hakemiston sisälle, joka sisältää module-info.java tiedosto: /com.javaworld.mod1/com/javaworld/package1. Nimeä tiedostoNimi.java. Lisää listan 2 sisältö sen sisälle.

Listaus 2: Nimi.java

 paketti com.javaworld.package1; public class Nimi {public String getIt () {return "Java World"; }} 

Listasta 2 tulee luokka, paketti ja moduuli, josta olemme riippuvaisia.

Luodaan nyt toinen hakemisto rinnakkain /com.javaworld.mod1 ja kutsu sitä /com.javaworld.mod2. Luodaan tässä hakemistossa a module-info.java moduulin määrittely, joka tuo jo luomamme moduulin, kuten luettelossa 3.

Listaus 3: com.javaworld.mod2 / module-info.java

 moduuli com.javaworld.mod2 {vaatii com.javaworld.mod1; } 

Listaus 3 on melko itsestään selvä. Se määrittelee com.javaworld.mod2 moduuli ja vaatii com.javaworld.mod1.

Sisällä /com.javaworld.mod2 hakemistoon, luo luokan polku näin: /com.javaworld.mod2/com/javaworld/package2.

Lisää nyt tiedosto nimeltään Hei.java, luettelossa 4 annetulla koodilla.

Listaus 4: Hello.java

 paketti com.javaworld.package2; tuo com.javaworld.package1.Name; public class Hei {public static void main (String [] args) {Name name = new Name (); System.out.println ("Hei" + nimi.getIt ()); }} 

Luettelossa 4 aloitetaan määrittämällä paketti ja tuomalla sitten com.javawolrd.package1.Name luokassa. Huomaa, että nämä elementit toimivat samalla tavalla kuin aina. Moduulit ovat muuttaneet tapaa, jolla paketit ovat käytettävissä tiedostorakenteella, ei kooditasolla.

Vastaavasti koodin itsensä pitäisi olla sinulle tuttu. Se yksinkertaisesti luo luokan ja kutsuu siihen menetelmän luoda klassinen esimerkki "hei maailma".

Suoritetaan modulaarinen Java-esimerkki

Ensimmäinen vaihe on luoda hakemistoja kääntäjän tuloksen vastaanottamiseksi. Luo hakemisto nimeltä /kohde projektin ytimessä. Luo sisälle hakemisto kullekin moduulille: /target/com.javaworld.mod1 ja /target/com.javaworld.mod2.

Vaihe 2 on koota riippuvuusmoduuli tulostamalla se /kohde hakemistoon. Kirjoita projektin juuressa komento Listing 5. (Tämä olettaa, että JDK on asennettu.)

Listaus 5: Rakennusmoduuli 1

 javac -d target / com.javaworld.mod1 com.javaworld.mod1 / module-info.java com.javaworld.mod1 / com / javaworld / package1 / Name.java 

Tämä aiheuttaa lähteen rakentamisen yhdessä sen moduulitietojen kanssa.

Vaihe 3 on luoda riippuvainen moduuli. Syötä Listauksessa 6 näkyvä komento.

Listaus 6: Rakennusmoduuli 2

 javac - moduulipolun kohde -d kohde / com.javaworld.mod2 com.javaworld.mod2 / module-info.java com.javaworld.mod2 / com / javaworld / package2 / Hello.java 

Katsotaanpa yksityiskohtaisesti luetteloa 6. Se esittelee module-polku argumentti javacille. Tämän avulla voimme määrittää moduulin polun samalla tavalla kuin --class-path -kytkin. Tässä esimerkissä ohitamme kohde hakemistoon, koska siinä luettelo 5 antaa moduulin 1.

Seuraavaksi luettelo 6 määrittelee ( -d kytkin) moduulin 2 lähtöhakemisto. Lopuksi annetaan todelliset kokoamisen aiheet, kuten module-info.java tiedosto ja luokka sisältyvät moduuliin 2.

Suorita käyttämällä Listing 7: ssä näkyvää komentoa.

Listaus 7: Moduulin pääluokan suorittaminen

 java --module-path target -m com.javaworld.mod2 / com.javaworld.package2.Hei 

--moduulin polku kytkin kertoo Java: n käyttää /kohde hakemisto moduulin juurena, ts. mistä moduuleja voi etsiä. -m kytkin on paikka, jossa kerromme Javalle, mikä on pääluokkamme. Huomaa, että edeltämme täysin hyväksytyn luokan nimen moduulilla.

Sinut tervehditään tuotoksella Hei Java World.

Takautuva yhteensopivuus

Saatat hyvinkin miettiä, kuinka voit käyttää Java-ohjelmia, jotka on kirjoitettu moduuliversioina Java 9: ​​n jälkeisessä maailmassa, koska edellinen koodipohja ei tiedä mitään moduulin polusta. Vastaus on, että Java 9 on suunniteltu yhteensopivaksi taaksepäin. Uusi moduulijärjestelmä on kuitenkin niin suuri muutos, että saatat törmätä ongelmiin, varsinkin suurissa koodikannoissa.

Kun suoritat ennen 9 koodikantaa Java 9: ​​ää vastaan, sinulla voi olla kahdenlaisia ​​virheitä: virheitä, jotka johtuvat koodipohjastasi, ja virheitä, jotka johtuvat riippuvuuksistasi.

Koodikannastasi johtuvien virheiden osalta seuraava komento voi olla hyödyllinen: jdeps. Kun tämä komento osoittaa luokan tai hakemiston kohdalle, se etsii riippuvuuksia ja mihin moduuleihin nämä riippuvuudet perustuvat.

Riippuvuuksista johtuvien virheiden osalta voit toivoa, että paketilla, josta olet riippuvainen, on päivitetty Java 9 -yhteensopiva koontiversio. Jos ei, sinun on ehkä etsittävä vaihtoehtoja.

Yksi yleinen virhe on tämä:

Kuinka korjata java.lang.NoClassDefFoundError: javax / xml / bind / JAXBException

Java valitti, ettei luokkaa löydy, koska se on siirtynyt moduuliin ilman näkyvyyttä kuluttavalle koodille. Tässä on muutama monimutkainen ja pysyvä ratkaisu.

Jälleen kerran, jos huomaat tällaisia ​​virheitä riippuvuussuhteella, tarkista projekti. Heillä voi olla Java 9 -rakenne, jota voit käyttää.

JPMS on melko laajamittainen muutos, ja sen hyväksyminen vie aikaa. Onneksi ei ole kiireellistä kiirettä, koska Java 8 on pitkäaikainen tukijulkaisu.

Tästä huolimatta vanhemmilla hankkeilla on pitkällä aikavälillä siirtyminen, ja uusien on käytettävä moduuleja älykkäästi, toivottavasti hyödyntämällä joitain luvattuja etuja.

Tämän tarinan "Mikä on JPMS? Esittelyssä Java Platform Module -järjestelmä" julkaisi alun perin JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found