Sistema del modulo della piattaforma Java - Java Platform Module System
La Platform Module Java System specifica un formato di distribuzione per le collezioni di Java codice e le risorse associate. Specifica inoltre un repository per l'archiviazione di queste raccolte, o moduli , e identifica come possono essere scoperti, caricati e verificati per l'integrità. Include funzionalità come gli spazi dei nomi con l'obiettivo di correggere alcune delle carenze nel formato JAR esistente , in particolare il JAR Hell , che può portare a problemi come il percorso di classe e problemi di caricamento delle classi.
Il Java Module System è stato inizialmente sviluppato nell'ambito del Java Community Process come JSR 277 ed è stato programmato per essere rilasciato con Java 7.
Successivamente JSR 277 è stato messo in attesa e Project Jigsaw è stato creato per modularizzare il JDK. Questo JSR è stato sostituito da JSR 376 (Java Platform Module System).
Il progetto Jigsaw era originariamente previsto per Java 7 (2011), ma è stato rinviato a Java 8 (2014) come parte del piano B, e ancora una volta rinviato a una versione di Java 9 nel 2017. Java 9, incluso Java Module System, è stato rilasciato il 21 settembre. 2017.
Architettura
Il Java Module System implementato in Java 9 include i seguenti JEP e JSR (Java Specification Request) :
- JEP 200: Il JDK modulare: definire una struttura modulare per il JDK
- JEP 201: codice sorgente modulare: riorganizza il codice sorgente JDK in moduli, migliora il sistema di compilazione per compilare moduli e applica i limiti del modulo in fase di compilazione
- JEP 220: immagini runtime modulari: ristrutturare le immagini runtime JDK e JRE per accogliere i moduli e migliorare le prestazioni, la sicurezza e la manutenibilità
- JEP 261: Sistema di moduli: implementare il sistema di moduli della piattaforma Java
- JEP 282: Java Linker: creare uno strumento in grado di assemblare e ottimizzare un set di moduli e le relative dipendenze in un'immagine runtime personalizzata
- JSR 376: Java Platform Module System
Inoltre, sono state aggiunte diverse altre funzionalità di JDK 9 per facilitare la transizione al sistema di moduli:
- JEP 238: file JAR a rilascio multiplo: estende il formato file JAR per consentire la coesistenza di più versioni specifiche del rilascio Java dei file di classe in un singolo archivio.
- JEP 253: preparare i controlli dell'interfaccia utente JavaFX e le API CSS per la modularizzazione: definire le API pubbliche per le funzionalità JavaFX che attualmente sono disponibili solo tramite API interne e diventerebbero inaccessibili a causa della modularizzazione.
- JEP 260: incapsula la maggior parte delle API interne: rende la maggior parte delle API interne di JDK inaccessibile per impostazione predefinita, ma lascia accessibili alcune API interne critiche e ampiamente utilizzate, fino a quando non esistono sostituzioni supportate per tutte o la maggior parte delle loro funzionalità.
- JEP 275: Pacchetto modulare di applicazioni Java: Il pacchetto Java si evolverà per JDK 9, rendendolo consapevole dei moduli, consentendo ad esempio di impacchettare un modulo e tutti i moduli da cui dipende.
Proprietà dei moduli
I moduli sono un nuovo modo di raggruppare il codice. Contrariamente ai file Jar , i moduli dichiarano esplicitamente da quali moduli dipendono e da quali pacchetti esportano. Le dichiarazioni di dipendenza esplicite migliorano l'integrità del codice, semplificando il ragionamento su applicazioni di grandi dimensioni e le dipendenze tra i componenti software.
Ad esempio, la seguente dichiarazione del modulo dichiara che il modulo com.foo.bar dipende da un altro modulo com.foo.baz ed esporta i seguenti pacchetti: com.foo.bar.alpha e com.foo.bar.beta :
module com.foo.bar {
requires com.foo.baz;
exports com.foo.bar.alpha;
exports com.foo.bar.beta;
}
I membri pubblici dei pacchetti com.foo.bar.alpha e com.foo.bar.beta saranno accessibili dai moduli dipendenti. I membri privati sono inaccessibili anche attraverso mezzi come la riflessione , sebbene se l'"accesso illegale" sia di fatto consentito dipende da un'impostazione della riga di comando.
Contrariamente al formato di file Jar, il modulo descriverà queste dipendenze in una dichiarazione di modulo che verrà inserita in un file denominato module-info.java alla radice della gerarchia del file sorgente del modulo. Il JDK sarà in grado di verificare le dipendenze e le interazioni tra i moduli sia in fase di compilazione che in fase di esecuzione. Lo stesso JDK è stato modularizzato in Java 9 .
Collegamenti con OSGi
Il Java Module System non intende supportare tutte le funzionalità che la piattaforma OSGi attualmente supporta (ad esempio il modello Life-Cycle e il Registro dei Servizi). Tuttavia, Java Module System supporterà funzioni che non sono supportate da OSGi, come la modularità in fase di compilazione e il supporto integrato per le librerie native. Nel 2016 sono stati pubblicati un paio di articoli che esplorano come il Java Module System e OSGi potrebbero interagire. Questi possono essere trovati su InfoQ e anche sul blog OSGi Alliance.