Iki „Java 9“ paketas buvo „Java“ aukščiausio lygio kodo organizavimo elementas. Pradedant „Java 9“, kuri pasikeitė: virš paketo dabar yra modulis. Modulis kartu renka susijusius paketus.
„Java Platform Module System“ (JPMS) yra kodo lygio struktūra, todėl tai nekeičia fakto, kad „Java“ pakuojame į JAR failus. Galų gale viskas vis dar sujungta į JAR failus. Modulio sistema įtraukia naują, aukštesnio lygio aprašą, kurį JAR gali naudoti, įtraukdami module-info.java
failą.
Didelio masto programos ir organizacijos pasinaudos moduliais, kad geriau tvarkytų kodą. Bet visi vartos modulius, nes JDK ir jo klasės dabar moduliuojamos.
Kodėl „Java“ reikia modulių
JPMS yra projekto „Jigsaw“ rezultatas, kuris buvo įgyvendintas siekiant šių tikslų:
- Palengvinkite kūrėjams didelių programų ir bibliotekų organizavimą
- Pagerinkite platformos ir paties JDK struktūrą ir saugumą
- Pagerinkite programos našumą
- Geriau tvarkant mažesnių įrenginių platformos skaidymą
Verta paminėti, kad JPMS yra SE („Standard Edition“) funkcija, todėl veikia visus „Java“ aspektus nuo pat pradžių. Tai pasakius, pakeitimas yra sukurtas leisti dauguma kodas, veikiantis be modifikavimo pereinant nuo „Java 8“ prie „Java 9.“. Tam yra keletas išimčių, kurias mes pastebėsime vėliau šioje apžvalgoje.
Pagrindinė modulio idėja yra leisti rinkti susijusius paketus, kurie yra matomi moduliui, tuo pačiu slepiant elementus nuo išorinių modulio vartotojų. Kitaip tariant, modulis leidžia atlikti kitą kapsuliavimo lygį.
Klasės kelias prieš modulio kelią
Iki šiol „Java“ klasės kelias buvo apatinė eilutė to, kas pasiekiama veikiančiai programai. Nors klasės kelias tarnauja šiam tikslui ir yra gerai suprantamas, galų gale tai yra didelis, nediferencijuotas kibiras, į kurį dedamos visos priklausomybės.
Modulio kelias prideda lygį virš klasės kelio. Tai tarnauja kaip pakuočių talpykla ir nustato, kokie paketai yra prieinami programai.
JDK moduliai
Pats JDK dabar yra sudarytas iš modulių. Pradėkime nuo ten esančių JPMS veržlių ir varžtų pažvelgimo.
Jei sistemoje turite JDK, turite ir šaltinį. Jei nesate susipažinę su JDK ir kaip jį gauti, pažiūrėkite į šį straipsnį.
JDK diegimo katalogo viduje yra / lib
kataloge. Tame kataloge yra a src.zip
failą. Atsegkite tai į / src
kataloge.
Pažvelkite į / src
katalogą ir eikite į /java.base
kataloge. Čia rasite module-info.java
failą. Atidarykite.
Po „Javadoc“ komentarais rasite skyrių pavadinimumodulis java.base
po to seka serija eksportas
linijos. Čia nesustosime prie formato, nes jis tampa gana ezoteriškas. Išsamią informaciją galite rasti čia.
Galite pamatyti, kad daugelis iš „Java“ žinomų paketų mėgsta java.io
, yra eksportuojami iš java.base
modulis. Tai yra paketo surinkimo modulio esmė.
Atvirkštinė pusėeksportas
yra reikalauja
instrukcija. Tai leidžia modulio reikalauti apibrėžtam moduliui.
Paleisdami „Java“ kompiliatorių prieš modulius, modulio kelią nurodote panašiai kaip klasės kelią. Tai leidžia išspręsti priklausomybes.
Modulinio „Java“ projekto kūrimas
Pažvelkime, kaip yra struktūrizuotas moduliuojamas „Java“ projektas.
Mes sukursime mažą programą, kurioje yra du moduliai, vienas teikia priklausomybę, kitas - naudoja tą priklausomybę ir eksportuoja vykdomąją pagrindinę klasę.
Sukurkite naują katalogą kur nors patogioje failų sistemoje. Vadink tai /com.javaworld.mod1
. Pagal susitarimą „Java“ moduliai gyvena kataloge, kurio pavadinimas yra tas pats kaip modulio.
Dabar šiame kataloge sukurkite module-info.java
failą. Viduje pridėkite turinį iš 1 sąrašo.
1 sąrašas: com.javaworld.mod1 / module-info.java
modulis com.javaworld.mod1 {eksportuoja com.javaworld.package1; }
Atkreipkite dėmesį, kad modulis ir jo eksportuojamas paketas yra skirtingi pavadinimai. Mes apibrėžiame modulį, kuris eksportuoja paketą.
Dabar sukurkite failą šiame kelyje kataloge, kuriame yra module-info.java
failas: /com.javaworld.mod1/com/javaworld/package1
. Pavadinkite failąVardas.java
. Į jį įdėkite 2 sąrašo turinį.
2 sąrašas: vardas.java
paketas com.javaworld.package1; public class Pavadinimas {public String getIt () {return "Java World"; }}
2 sąrašas taps klase, paketu ir moduliu, nuo kurio mes priklausome.
Dabar sukurkime kitą katalogą lygiagrečiai /com.javaworld.mod1
ir paskambink /com.javaworld.mod2
. Šiame kataloge sukurkime a module-info.java
modulio apibrėžimas, kuris importuoja mūsų jau sukurtą modulį, kaip 3 sąraše.
3 sąrašas: com.javaworld.mod2 / module-info.java
modulis com.javaworld.mod2 {reikia com.javaworld.mod1; }
3 sąrašas yra savaime suprantamas. Jis apibrėžia com.javaworld.mod2
modulis ir reikalauja com.javaworld.mod1
.
Viduje /com.javaworld.mod2
kataloge, sukurkite klasės kelią taip: /com.javaworld.mod2/com/javaworld/package2
.
Dabar pridėkite failą, vadinamą Labas.java
, su kodu, nurodytu 4 sąraše.
4 sąrašas: Hello.java
paketas com.javaworld.package2; importuoti com.javaworld.package1.Pavadinimas; viešoji klasė Sveiki {public static void main (String [] args) {Name name = new Name (); System.out.println („Labas“ + vardas.getIt ()); }}
4 sąraše mes pradedame apibrėždami paketą, tada importuojame com.javawolrd.package1.Pavadinimas
klasė. Atkreipkite dėmesį, kad šie elementai veikia taip pat, kaip visada. Moduliai pakeitė tai, kaip paketai yra prieinami failų struktūros, o ne kodų lygiu.
Panašiai ir pats kodas turėtų būti jums žinomas. Tiesiog sukuriama klasė ir iškviečiamas metodas sukurti klasikinį „labo pasaulio“ pavyzdį.
Modulinio „Java“ pavyzdžio paleidimas
Pirmasis žingsnis yra sukurti katalogus, kad gautumėte kompiliatoriaus išvestį. Sukurkite katalogą, vadinamą / taikinys
projekto esmė. Viduje sukurkite katalogą kiekvienam moduliui: /target/com.javaworld.mod1
ir /target/com.javaworld.mod2
.
2 žingsnis - sukompiliuoti priklausomybės modulį, jį išvedant į / taikinys
kataloge. Projekto šaknyje įveskite komandą 5 sąraše. (Tai daro prielaidą, kad JDK yra įdiegtas.)
5 sąrašas: 1 pastatas
javac -d target / com.javaworld.mod1 com.javaworld.mod1 / module-info.java com.javaworld.mod1 / com / javaworld / package1 / Name.java
Tai sukels šaltinį ir jo modulio informaciją.
3 žingsnis - sukurti priklausomą modulį. Įveskite komandą, parodytą 6 sąraše.
6 sąrašas: 2 pastatas
javac - modulio kelio kelias -d target / com.javaworld.mod2 com.javaworld.mod2 / module-info.java com.javaworld.mod2 / com / javaworld / package2 / Hello.java
Pažvelkime į 6 sąrašą išsamiai. Tai supažindina su modulis-kelias
argumentas javacui. Tai leidžia mums apibrėžti modulio kelią panašiai kaip --class-path jungikliu. Šiame pavyzdyje mes einame į taikinys
katalogą, nes būtent ten 5 sąrašas išveda 1 modulį.
Toliau 6 sąrašas apibrėžia (per -d
jungiklis) 2 modulio išvesties katalogas. Galiausiai pateikiami faktiniai kompiliavimo dalykai, kaip module-info.java
byla ir klasė, esanti 2 modulyje.
Norėdami paleisti, naudokite komandą, parodytą 7 sąraše.
7 sąrašas: pagrindinės modulio klasės vykdymas
java - modulio kelio taikinys -m com.javaworld.mod2 / com.javaworld.package2.Sveiki
--modulio kelias
jungiklis liepia „Java“ naudoti / taikinys
katalogą kaip modulio šaknį, t. y. kur ieškoti modulių. -m
jungikliu mes pasakojame „Java“, kokia yra mūsų pagrindinė klasė. Atkreipkite dėmesį, kad prieš visą kvalifikuotą klasės pavadinimą įvedame jo modulį.
Būsite sutikti su išvestimi Sveiki „Java World“
.
Atgalinis suderinamumas
Jums gali būti įdomu, kaip galite paleisti „Java“ programas, parašytas iš anksto modulių versijomis „Java Java 9“ pasaulyje, atsižvelgiant į tai, kad ankstesnė kodų bazė nieko nežino apie modulio kelią. Atsakymas yra tas, kad „Java 9“ yra sukurta taip, kad būtų suderinama atgal. Tačiau naujoji modulių sistema yra toks didelis pokytis, kad gali kilti problemų, ypač didelėse kodų bazėse.
Paleisdami „Java 9“ prieš 9 kodų bazę, galite susidurti su dviejų rūšių klaidomis: tomis, kurios kyla iš jūsų kodo bazės, ir su tomis, kurios kyla iš jūsų priklausomybių.
Dėl klaidų, kilusių iš jūsų kodo bazės, gali būti naudinga ši komanda: jdeps
. Ši komanda, nukreipta į klasę ar katalogą, nuskaitys, kokios yra priklausomybės ir kokiais moduliais tos priklausomybės remiasi.
Dėl klaidų, atsirandančių dėl jūsų priklausomybės, galite tikėtis, kad paketas, nuo kurio priklausote, turės atnaujintą „Java 9“ suderinamą versiją. Jei ne, jums gali tekti ieškoti alternatyvų.
Viena dažna klaida yra ši:
Kaip išspręsti java.lang.NoClassDefFoundError: javax / xml / bind / JAXBException
Tai „Java“ skundžiasi, kad klasė nerasta, nes ji perėjo į modulį, nematydama vartojimo kodo. Yra keli įvairaus sudėtingumo ir pastovumo sprendimai, aprašyti čia.
Vėlgi, jei aptinkate tokių klaidų, susijusių su priklausomybe, pasitarkite su projektu. Jie gali turėti „Java 9“ versiją, kurią galėsite naudoti.
JPMS yra gana platus pakeitimas, kurį priimti reikės laiko. Laimei, skubėti nereikia, nes „Java 8“ yra ilgalaikis palaikymo leidimas.
Tai sakant, ilgainiui senesni projektai turės pereiti, o nauji - protingai naudoti modulius, tikimės, kad pasinaudos kai kuriomis pažadėtomis naudomis.
Šią istoriją „Kas yra JPMS? Pristatome„ Java “platformos modulių sistemą“ iš pradžių paskelbė „JavaWorld“.