S příchodem Javy 9 se nejčastěji mluví o Jigsaw, o nové modulární architektuře samotného JDK. Znamená to pro programátory nějakou změnu? Co náš starý kód, bude stále fungovat?

Když u nás v březnu přednášel Juergen Hoeller o Springu 5 (video zde), velkou část jeho přednášky věnoval také novinkám Javy 9. Co mě docela zarazilo byl jeho možná až skeptický názor na Jigsaw. Podle Juergena Jigsaw je a ještě dlouho bude dobrovolným prvkem a nikdo se do něj jen tak nepožene. Proč? Pokud jste již někdy migrovali váš code base z předchozí verze Javy na novou, většinou jen stačilo nainstalovat nové JDK a přepsat někde ve vašich build scriptech či pom.xml aktuálně používanou Javu a její verzi. S devítkou to tak jednoduché nebude.

Modulární JDK

Ať napíšete sebemenší aplikaci v Javě, na to abyste ji mohli spustit potřebujete JRE a s tím i 50MB soubor rt.jar, který obsahuje téměř všechny základní třídy Javy. Při samotném spouštění aplikace se pak všechny tyto třídy načítají, i když nemusí být nikdy použity. Tento problém se začal řešit už v dobách Javy 6, ale až nyní téměř o 10 let později se nám dostává výsledku.

Jigsaw, nebo nově JPMS (Java Platform Module System), umožnil rozdělit monolit Javy na necelou stovku modulů, které mají jasně definované závislosti a přináší do světa Javy několik nových prvků.

Vlastní runtime image

Jak rozdělení do modulů řeší velikost JRE nebo JDK? S novou verzí Javy je distribuován nástroj jlink, který umožňuje vaší aplikaci vygenerovat odlehčené JRE pouze s moduly, které vaše aplikace využívá. To trochu souvisí i se změnou v JRE vs. JDK, od Javy 9 mají stejnou strukturu, jen jiný počet modulů.

Vlastní moduly

Rozdělení do modulů se ale neomezuje pouze na JDK/JRE, kdokoliv si může vytvořit modul vlastní a využít tak (ne)výhod, které to přináší.

Viditelnost tříd mezi moduly

V předchozích verzích Javy byla jakákoliv public třída přístupná všem ostatním třídám na classpath. To již v modulárním systému neplatí. Pokud chce autor povolit přístup k určité třídě, musí její balíček označit pro export v module-info.java konfiguračním souboru.

To přináší vývojářům další vrstvu zaobalení jejich kódu, ale zároveň spoustu nových výzev. Jednou ze zásadních změn je znepřístupnění některých com.sun.* tříd a všech sun.* tříd.

Pokud nějakou takovou třídu ve vašem kódu používáte, budete buď muset využít speciálních runtime parametrů k obejití této restrikce nebo se obejít bez nich.

Kontrola závislostí

Java je známá svými problémy s chybějícími třídami na classpath, případně duplicitními závislostmi – Dependency / Classpath / Jar hell. I když tento problém řešíte například Mavenem, stále se může stát, že za běhu aplikace dostane ClassNotFoundException.

Příchod modulů tento problém přesouvá již na samotný start aplikace. Pokud aplikace nenajde všechny potřebné závislosti, aplikace nenaběhne.

module-info.java

Aby mohl být projekt interpretován jako modul, musí source složka obsahovat soubor module-info.java V tomto souboru se definuje název modulu, jeho závislosti, export balíčků a nebo konfigurace service lokátoru, ale o něm třeba někdy jindy.

Takový soubor pak může vypadat následovně:



module cz.morosystems.test.module1 {

requires java.desktop;
requires cz.morosystems.test.module2

// všechny public třídy v balíčku api, budou dostupné i v ostatních modulech
exports cz.morosystems.test.module1.api

}

Zpětná kompatibilita

Java 9 je plně kompatibilní s předchozími verzemi. Všechny změny okolo modulárního systému se berou v potaz, pouze spustíte-li aplikaci v modulárním režimu (oproti “legacy” classpath režimu). Nicméně zkompilovat projekt pod Javou 9 už může vyžadovat nějaké úsilí.

Pokud plánujete přechod na Javu 9 a její modulární systém, doporučuji si přečíst blog https://blog.codefx.org/java/java-9-migration-guide/, kde autor dopodrobna probírá úskalí a řešení různých problémů.


Zajímají tě nejlepší technologie na zajímavých projektech?

Aktuálně hledáme Java EE Developery do kanceláří v Hradci Králové, Brně, Bratislavě ale i na home-office.

Paříš raději front-end (Angular nebo React)? Pokud ano, tak právě hledáme i tebe.

Zajímá tě něco jiného? Mrkni na všechny naše otevřené pozice a dej nám o sobě vědět, bez ohledu na to, zda máš rád front-end nebo back-end, jestli nějakou technologii umíš nebo ne. Pokud budeš ty sám chtít, dostaneš u nás příležitost naučit se, co tě zajímá nebo udělat něco výjimečného.