Java Platform Module System - Java Platform Module System
Platform Module Java System specifică un format de distribuție pentru colecții de Java cod și a resurselor asociate. De asemenea, specifică un depozit pentru stocarea acestor colecții sau module și identifică modul în care pot fi descoperite, încărcate și verificate pentru integritate. Acesta include caracteristici precum spații de nume cu scopul de a remedia unele dintre neajunsurile în formatul JAR existent , în special JAR Hell , care poate duce la probleme precum clasa de cale și probleme de încărcare a clasei.
Sistemul Java Module a fost inițial dezvoltat în cadrul Java Community Process ca JSR 277 și a fost programat să fie lansat cu Java 7.
JSR 277 mai târziu a fost pus în așteptare și Project Jigsaw a fost creat pentru a modula JDK. Acest JSR a fost înlocuit de JSR 376 (Java Platform Module System).
Project Jigsaw a fost inițial destinat Java 7 (2011), dar a fost amânat la Java 8 (2014) ca parte a Planului B și a fost amânat din nou la o versiune Java 9 în 2017. Java 9, inclusiv sistemul Java Module, a fost lansat pe 21 septembrie, 2017.
Arhitectură
Sistemul Java Module implementat în Java 9 include următoarele JEPs și JSR (Java Specification Request) :
- JEP 200: Modular JDK: Definiți o structură modulară pentru JDK
- JEP 201: Cod sursă modulară: Reorganizați codul sursă JDK în module, îmbunătățiți sistemul de compilare pentru a compila module și impuneți limitele modulelor la momentul construirii
- JEP 220: Imagini modulare în timpul rulării: restructurați imaginile în timpul rulării JDK și JRE pentru a găzdui module și pentru a îmbunătăți performanța, securitatea și mentenanța
- JEP 261: Module System: Implementați Java Platform Module System
- JEP 282: Java Linker: Creați un instrument care poate asambla și optimiza un set de module și dependențele acestora într-o imagine personalizată în timpul rulării
- JSR 376: Java Platform Module System
În plus, au fost adăugate câteva alte caracteristici JDK 9 pentru a facilita trecerea la sistemul de module:
- JEP 238: Multi-Release JAR Files: Extindeți formatul de fișier JAR pentru a permite mai multe versiuni specifice Java-release ale fișierelor de clasă să coexiste într-o singură arhivă.
- JEP 253: Pregătiți comenzile JavaFX UI și API-urile CSS pentru modularizare: definiți API-urile publice pentru funcționalitățile JavaFX care sunt disponibile în prezent doar prin intermediul API-urilor interne și care ar deveni inaccesibile datorită modularizării.
- JEP 260: încapsulează majoritatea API-urilor interne: face ca majoritatea API-urilor interne ale JDK să fie inaccesibile în mod implicit, dar lăsați câteva API-uri critice, utilizate pe scară largă accesibile, până când există înlocuiri acceptate pentru toate sau majoritatea funcționalităților lor.
- JEP 275: Ambalare modulară a aplicațiilor Java: Pachetul Java va evolua pentru JDK 9, făcându-l conștient de module, permițând, de exemplu, să pacheteze un modul și toate modulele de care depinde.
Proprietățile modulelor
Modulele sunt un nou mod de grupare a codului. Contrar fișierelor Jar , modulele declară în mod explicit de ce module depind și de ce pachete exportă. Declarațiile de dependență explicite îmbunătățesc integritatea codului, facilitând argumentarea aplicațiilor mari și a dependențelor dintre componentele software.
De exemplu, următoarea declarație de modul declară că modulul com.foo.bar depinde de un alt modul com.foo.baz și exportă următoarele pachete: com.foo.bar.alpha și com.foo.bar.beta :
module com.foo.bar {
requires com.foo.baz;
exports com.foo.bar.alpha;
exports com.foo.bar.beta;
}
Membrii publice de com.foo.bar.alpha și com.foo.bar.beta pachete vor fi accesibile prin module dependente. Membrii privați sunt inaccesibili chiar și prin mijloace precum reflectarea , deși dacă „accesul ilegal” este de facto permis depinde de o setare a liniei de comandă.
Spre deosebire de formatul de fișier Jar, modulul va descrie aceste dependențe într-o declarație de modul care va fi plasată într-un fișier numit module-info.java la rădăcina ierarhiei fișierului sursă a modulului. JDK va putea verifica dependențele și interacțiunile dintre module atât în timpul compilării, cât și în timpul rulării. JDK în sine a fost modularizat în Java 9 .
Legături cu OSGi
Sistemul Java Module nu intenționează să susțină toate funcționalitățile pe care platforma OSGi le suportă în prezent (de exemplu, modelul Life-Cycle și Registrul de servicii). Cu toate acestea, sistemul Java Module va suporta funcții care nu sunt acceptate de OSGi, cum ar fi modularitatea la compilare și suportul încorporat pentru bibliotecile native. Câteva articole care explorează modul în care sistemul Java Module și OSGi ar putea interopera au fost publicate în 2016. Acestea pot fi găsite pe InfoQ și, de asemenea, pe OSGi Alliance Blog.