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.