Systémový modul Java Platform - Java Platform Module System
Systém Java Platform Module System určuje distribuční formát pro sbírky kódu Java a přidružené prostředky. Rovněž určuje úložiště pro ukládání těchto kolekcí nebo modulů a identifikuje, jak je lze zjistit, načíst a zkontrolovat integritu. Zahrnuje funkce, jako jsou jmenné prostory, s cílem opravit některé nedostatky ve stávajícím formátu JAR , zejména JAR Hell , což může vést k problémům, jako je classpath a problémy s načítáním tříd.
Systém Java Module System byl původně vyvíjen v rámci procesu Java Community Process jako JSR 277 a jeho vydání bylo naplánováno na verzi Java 7.
JSR 277 později byl pozastaven a byl vytvořen projekt Jigsaw, aby modularizoval JDK. Tento JSR byl nahrazen JSR 376 (Java Platform Module System).
Project Jigsaw byl původně určen pro prostředí Java 7 (2011), ale byl odložen na prostředí Java 8 (2014) jako součást plánu B a opět odložen na vydání Java 9 v roce 2017. Java 9 včetně systému Java Module System byla vydána 21. září, 2017.
Architektura
Systém Java Module implementovaný v prostředí Java 9 zahrnuje následující JEP a JSR (Java Specification Request) :
- JEP 200: The Modular JDK: Define a modular structure for the JDK
- JEP 201: Modulární zdrojový kód: Reorganizujte zdrojový kód JDK na moduly, vylepšete systém sestavení tak, aby kompiloval moduly, a vymáhejte hranice modulů v době sestavení
- JEP 220: Modulární běhové obrazy: Restrukturalizujte běhové obrazy JDK a JRE tak, aby vyhovovaly modulům a zlepšily výkon, zabezpečení a udržovatelnost
- JEP 261: Module System: Implement the Java Platform Module System
- JEP 282: The Java Linker: Create a tool that can assemblies and optimize a set of modules and their dependencies into a custom run-time image
- JSR 376: Systém Java Platform Module
Navíc bylo přidáno několik dalších funkcí JDK 9, které usnadňují přechod na systém modulů:
- JEP 238: Soubory JAR s více verzemi: Rozšíření formátu souboru JAR tak, aby umožňovalo koexistenci více verzí souborů tříd specifických pro Javu v jednom archivu.
- JEP 253: Prepare JavaFX UI Controls & CSS APIs for Modularization: Define public APIs for the JavaFX funkcionalities that is nowly available only through internal APIs and would become a neprístupný kvůli modularizaci.
- JEP 260: Zapouzdřit většinu interních rozhraní API: Ve výchozím nastavení zpřístupní většinu interních rozhraní API JDK, ale ponechá přístup k několika kritickým, široce používaným interním rozhraním API, dokud nebudou existovat podporované náhrady pro všechny nebo většinu jejich funkcí.
- JEP 275: Modular Java Application Packaging: Java packager se bude vyvíjet pro JDK 9, čímž bude informován o modulech, což umožní například zabalit modul a všechny moduly, na kterých závisí.
Vlastnosti modulů
Moduly představují nový způsob seskupování kódu. Na rozdíl od souborů Jar moduly výslovně deklarují, na kterých modulech jsou závislé a jaké balíčky exportují. Explicitní deklarace závislostí zlepšují integritu kódu tím, že usnadňují uvažování o velkých aplikacích a závislostech mezi softwarovými komponentami.
Například následující deklarace modulu deklaruje, že modul com.foo.bar závisí na jiném modulu com.foo.baz a exportuje následující balíčky: com.foo.bar.alpha a com.foo.bar.beta :
module com.foo.bar {
requires com.foo.baz;
exports com.foo.bar.alpha;
exports com.foo.bar.beta;
}
Veřejní členové balíčků com.foo.bar.alpha a com.foo.bar.beta budou přístupní prostřednictvím závislých modulů. Soukromí členové jsou nepřístupní i prostřednictvím prostředků, jako je reflexe , ačkoli to, zda je de facto povolen „nelegální přístup“, závisí na nastavení příkazového řádku.
Na rozdíl od formátu souboru Jar modul popíše tyto závislosti v deklaraci modulu, která bude umístěna do souboru s názvem module-info.java v kořenovém adresáři hierarchie zdrojových souborů modulu. JDK bude schopen ověřovat závislosti a interakce mezi moduly jak v době kompilace, tak za běhu. Samotný JDK byl modulován v Javě 9 .
Odkazy s OSGi
Systém Java Module System nemá v úmyslu podporovat všechny funkce, které platforma OSGi aktuálně podporuje (například model životního cyklu a registr služeb). Systém Java Module System však bude podporovat funkce, které OSGi nepodporuje, jako je modularita v době kompilace a integrovaná podpora nativních knihoven. V roce 2016 bylo publikováno několik článků, které zkoumají, jak mohou Java Module System a OSGi spolupracovat. Naleznete je na InfoQ a také na blogu OSGi Alliance.