Až do verzie Java 9 bol balík prvkom organizácie Java na najvyššej úrovni kódovania. Počnúc Java 9, ktorá sa zmenila: nad balíkom je teraz modul. Modul zhromažďuje súvisiace balíčky spoločne.
Systém Java Platform Module System (JPMS) je štruktúra na úrovni kódu, takže to nič nemení na skutočnosti, že program Java balíme do súborov JAR. Nakoniec je všetko stále zoskupené v súboroch JAR. Systém modulov pridáva nový deskriptor vyššej úrovne, ktorý môžu súbory JAR používať, začlenením modul-info.java
spis.
Rozsiahle aplikácie a organizácie využijú výhody modulov na lepšie usporiadanie kódu. Ale všetci budú konzumovať moduly, pretože JDK a jeho triedy sú teraz modularizované.
Prečo Java potrebuje moduly
JPMS je výsledkom projektu Jigsaw, ktorý bol realizovaný s nasledujúcimi cieľmi:
- Uľahčite vývojárom organizáciu veľkých aplikácií a knižníc
- Zlepšiť štruktúru a zabezpečenie platformy a samotnej JDK
- Zlepšite výkon aplikácií
- Lepšie zvládnite rozklad platformy pre menšie zariadenia
Za zmienku stojí, že JPMS je funkcia SE (Standard Edition), a preto ovplyvňuje každý aspekt Javy od základu. Zmena je navrhnutá tak, aby umožňovala najviac kód bude fungovať bez úprav pri prechode z Javy 8 na Javu 9. Existujú určité výnimky, ktoré si všimneme ďalej v tomto prehľade.
Hlavnou myšlienkou modulu je umožniť zhromažďovanie súvisiacich balíkov, ktoré sú viditeľné pre modul, a zároveň skrývať prvky pred externými spotrebiteľmi modulu. Inými slovami, modul umožňuje inú úroveň zapuzdrenia.
Cesta triedy vs. cesta modulu
V Jave bola doteraz cesta k triede spodným riadkom toho, čo je k dispozícii pre spustenú aplikáciu. Aj keď cesta triedy slúži tomuto účelu a je dobre pochopená, nakoniec sa stane veľkým nediferencovaným segmentom, do ktorého sú umiestnené všetky závislosti.
Cesta modulu pridáva úroveň nad cestu triedy. Slúži ako kontajner pre balíčky a určuje, ktoré balíčky má aplikácia k dispozícii.
Moduly v JDK
Samotný JDK je teraz zložený z modulov. Začnime tým, že sa pozrieme na matice a skrutky JPMS, ktoré sa tam nachádzajú.
Ak máte v systéme JDK, máte k dispozícii aj zdroj. Ak nie ste oboznámení s JDK a ako ho získať, pozrite si tento článok.
Vo vašom inštalačnom adresári JDK je a / lib
adresár. Vo vnútri tohto adresára sa nachádza src.zip
spis. Rozbaľte to na a / src
adresár.
Pozri sa dovnútra / src
adresár a prejdite na /java.base
adresár. Tam nájdete modul-info.java
spis. Otvor to.
Po komentároch Javadoc v hornej časti nájdete sekciu s názvommodul java.base
po ktorom nasleduje séria vývoz
riadky. Nebudeme sa tu zaoberať týmto formátom, pretože bude dosť ezoterický. Podrobnosti nájdete tu.
Vidíte, že mnoho známych balíkov z Javy sa páči java.io
, sa vyvážajú z java.base
modul. Toto je podstata modulu, ktorý zhromažďuje balíčky.
Odvrátená stranavývoz
je vyžaduje
poučenie. Toto umožňuje, aby modul vyžadoval definovaný modul.
Pri spustení kompilátora Java proti modulom určíte cestu k modulu podobným spôsobom ako cestu k triede. To umožňuje vyriešiť nedostatky.
Vytvorenie modulárneho projektu Java
Poďme sa pozrieť na to, ako je štruktúrovaný modulovaný projekt Java.
Chystáme sa vytvoriť malý program, ktorý má dva moduly, jeden, ktorý dodáva závislosť a druhý, ktorý túto závislosť používa a exportuje spustiteľnú hlavnú triedu.
Vytvorte nový adresár kdekoľvek vo vašom súborovom systéme. Volaj to /com.javaworld.mod1
. Podľa konvencie žijú moduly Java v adresári, ktorý má rovnaký názov ako modul.
Teraz v tomto adresári vytvorte modul-info.java
spis. Vo vnútri pridajte obsah zo zoznamu 1.
Zoznam 1: com.javaworld.mod1 / module-info.java
modul com.javaworld.mod1 {exportuje com.javaworld.package1; }
Všimnite si, že modul a balík, ktorý exportuje, majú rôzne názvy. Definujeme modul, ktorý exportuje balík.
Teraz vytvorte súbor na tejto ceste v adresári, ktorý obsahuje modul-info.java
spis: /com.javaworld.mod1/com/javaworld/package1
. Pomenujte súborMeno.java
. Vložte doň obsah zoznamu 2.
Výpis 2: Name.java
balíček com.javaworld.package1; public class Názov {public String getIt () {return "Java World"; }}
Zoznam 2 sa stane triedou, balíkom a modulom, od ktorého sme závislí.
Teraz vytvoríme ďalší adresár paralelne s /com.javaworld.mod1
a zavolaj to /com.javaworld.mod2
. V tomto adresári vytvoríme modul-info.java
definícia modulu, ktorá importuje modul, ktorý sme už vytvorili, ako v zozname 3.
Výpis 3: com.javaworld.mod2 / module-info.java
modul com.javaworld.mod2 {vyžaduje com.javaworld.mod1; }
Zoznam 3 je celkom samozrejmý. Definuje com.javaworld.mod2
modul a vyžaduje com.javaworld.mod1
.
Vnútri /com.javaworld.mod2
adresár, vytvorte cestu triedy takto: /com.javaworld.mod2/com/javaworld/package2
.
Teraz pridajte dovnútra súbor s názvom Ahoj.java
, s kódom uvedeným v zozname 4.
Výpis 4: Hello.java
balíček com.javaworld.package2; import com.javaworld.package1.Name; public class Hello {public static void main (String [] args) {Name name = new Name (); System.out.println ("Dobrý deň" + name.getIt ()); }}
V zozname 4 začneme definovaním balíka a následným importom súboru com.javawolrd.package1.Name
trieda. Berte na vedomie, že tieto prvky fungujú rovnako ako vždy. Moduly zmenili spôsob sprístupňovania balíkov na úrovni štruktúry súborov, nie na úrovni kódu.
Podobne by vám mal byť známy aj samotný kód. Jednoducho vytvorí triedu a zavolá na ňu metódu na vytvorenie klasického príkladu „ahoj svet“.
Spustenie modulárneho príkladu Java
Prvým krokom je vytvorenie adresárov na príjem výstupu kompilátora. Vytvorte adresár s názvom / cieľ
v jadre projektu. Vo vnútri vytvorte adresár pre každý modul: /target/com.javaworld.mod1
a /target/com.javaworld.mod2
.
Krokom 2 je zostavenie modulu závislostí a jeho výstup do formátu / cieľ
adresár. V koreňovej časti projektu zadajte príkaz do Zoznamu 5. (Predpokladá sa, že je nainštalovaný JDK.)
Výpis 5: Stavebný modul 1
javac -d target / com.javaworld.mod1 com.javaworld.mod1 / module-info.java com.javaworld.mod1 / com / javaworld / package1 / Name.java
To spôsobí vytvorenie zdroja spolu s informáciami o jeho module.
Krok 3 je vygenerovanie závislého modulu. Zadajte príkaz zobrazený v zozname 6.
Výpis 6: Stavebný modul 2
javac --module-path target -d target / com.javaworld.mod2 com.javaworld.mod2 / module-info.java com.javaworld.mod2 / com / javaworld / package2 / Hello.java
Pozrime sa podrobne na zoznam 6. Zavádza cesta modulu
argument pre javac. To nám umožňuje definovať cestu modulu podobne ako prepínač --class-path. V tomto príklade prechádzame okolo cieľ
adresár, pretože práve tu je výpis 5 výstupov modulu 1.
Ďalej zoznam 6 definuje (prostredníctvom -d
switch) výstupný adresár pre modul 2. Nakoniec sú uvedené skutočné predmety kompilácie ako modul-info.java
súbor a trieda obsiahnutá v module 2.
Ak chcete spustiť, použite príkaz uvedený v zozname 7.
Výpis 7: Vykonanie hlavnej triedy modulu
java --module-path target -m com.javaworld.mod2 / com.javaworld.package2.Hello
The --modul-cesta
prepínač povie Java, aby ju použila / cieľ
adresár ako koreň modulu, t. j. kde hľadať moduly. The -m
switch je miesto, kde povieme Jave, aká je naša hlavná trieda. Všimnite si, že predtým uvádzame úplný názov triedy s jeho modulom.
Budete privítaní s výstupom Ahoj svet Java
.
Spätná kompatibilita
Možno by vás zaujímalo, ako môžete vo svete po vydaní Java 9 spúšťať programy Java napísané v predmodulárnych verziách, pretože predchádzajúca základňa kódov nevie nič o ceste modulu. Odpoveď je, že Java 9 je navrhnutá tak, aby bola spätne kompatibilná. Nový systém modulov je však taká veľká zmena, že môžete naraziť na problémy, najmä vo veľkých databázach kódov.
Pri spustení základnej verzie pre-9 proti Java 9 sa môžete stretnúť s dvoma druhmi chýb: chybami, ktoré vychádzajú z vašej základne kódov, a chybami, ktoré vyplývajú z vašich závislostí.
V prípade chýb, ktoré vychádzajú z vašej kódovej základne, môže byť užitočný nasledujúci príkaz: jdeps
. Tento príkaz, keď sa ukáže na triedu alebo adresár, vyhľadá, aké závislosti tam sú a na ktorých moduloch sa tieto závislosti spoliehajú.
V prípade chýb, ktoré vychádzajú z vašich závislostí, môžete dúfať, že balíček, na ktorom ste závislí, bude mať aktualizované zostavenie kompatibilné s Java 9. Ak nie, možno budete musieť hľadať alternatívy.
Jedna častá chyba je táto:
Ako vyriešiť java.lang.NoClassDefFoundError: javax / xml / bind / JAXBException
Toto si Java sťažuje, že trieda sa nenašla, pretože prešla na modul bez viditeľnosti pre spotrebný kód. Tu je popísaných niekoľko riešení rôznej zložitosti a stálosti.
Opäť platí, že ak objavíte také chyby so závislosťou, overte si to v projekte. Môžu mať zostavu Java 9, ktorú môžete použiť.
JPMS je pomerne rozsiahla zmena a jej prijatie si bude vyžadovať čas. Našťastie neexistuje urgentný zhon, pretože Java 8 je vydanie s dlhodobou podporou.
Ako už bolo povedané, z dlhodobého hľadiska bude potrebné migrovať staršie projekty a nové projekty budú musieť inteligentne využívať moduly, dúfajme, že využijú niektoré zo sľúbených výhod.
Tento príbeh „Čo je JPMS? Predstavujeme systém Java Platform Module System“ bol pôvodne publikovaný spoločnosťou JavaWorld.