Programovanie

Čo je JPMS? Predstavujeme systém platforiem Java Platform

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.

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