Programavimas

Kas yra JPMS? Pristatome „Java“ platformos modulių sistemą

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“.