# Sistema de mòduls de plataforma Java

El Java Platform Module System especifica un format de distribució per a col·leccions de codi Java i recursos associats. També especifica un repositori per emmagatzemar aquestes col·leccions, o mòduls, i identifica com es poden descobrir, carregar i comprovar la integritat. Inclou funcions com els espais de noms amb l'objectiu de solucionar algunes de les deficiències del format JAR existent, especialment el JAR Hell, que pot provocar problemes com ara el camí de classe i els problemes de càrrega de classes.
El sistema de mòduls de Java s'estava desenvolupant inicialment sota el procés de la comunitat Java com a JSR 277 i estava programat per ser llançat amb Java 7.
Més tard, el JSR 277 es va suspendre i es va crear Project Jigsaw per modularitzar el JDK. Aquest JSR va ser substituït per JSR 376 (Java Platform Module System).
Project Jigsaw estava pensat originalment per a Java 7 (2011), però es va ajornar a Java 8 (2014) com a part del Pla B, i es va ajornar de nou a una versió de Java 9 el 2017. Java 9, inclòs el sistema de mòduls Java, es va llançar el 21 de setembre de 2017.

## Arquitectura

El sistema de mòduls Java implementat a Java 9 inclou els següents JEP i JSR (sol·licitud d'especificació de Java) :
* JEP 200: el JDK modular: defineix una estructura modular per al JDK
* JEP 201: Codi font modular: reorganitzeu el codi font JDK en mòduls, milloreu el sistema de compilació per compilar mòduls i compliu els límits dels mòduls en temps de compilació
* JEP 220: Imatges modulars en temps d'execució: reestructura les imatges en temps d'execució JDK i JRE per adaptar-se als mòduls i millorar el rendiment, la seguretat i el manteniment.
* JEP 261: Sistema de mòduls: implementeu el sistema de mòduls de la plataforma Java
* JEP 282: l'enllaçador de Java: creeu una eina que pugui reunir i optimitzar un conjunt de mòduls i les seves dependències en una imatge personalitzada en temps d'execució
* JSR 376: sistema de mòduls de plataforma Java
A més, s'han afegit diverses altres funcions de JDK 9 per facilitar la transició al sistema de mòduls:
* JEP 238: Fitxers JAR de llançament múltiple: Amplieu el format de fitxer JAR per permetre que diverses versions específiques de la versió de Java dels fitxers de classe coexisteixin en un únic arxiu.
* JEP 253: Prepareu els controls d'interfície d'usuari de JavaFX i les API CSS per a la modularització: definiu les API públiques per a les funcionalitats de JavaFX que actualment només estan disponibles mitjançant API internes i que esdevindrien inaccessibles a causa de la modularització.
* JEP 260: encapsular la majoria de les API internes: feu que la majoria de les API internes del JDK siguin inaccessibles de manera predeterminada, però deixeu accessibles unes quantes API internes crítiques i molt utilitzades, fins que hi hagi substitucions compatibles per a totes o la majoria de les seves funcionalitats.
* JEP 275: Empaquetatge d'aplicacions Java modulars: el paquet de Java evolucionarà per a JDK 9, fent-lo conscient dels mòduls, permetent per exemple empaquetar un mòdul i tots els mòduls dels quals depèn.
Propietats dels mòduls
Els mòduls són una nova forma d'agrupar el codi. Contràriament als fitxers Jar, els mòduls declaren explícitament de quins mòduls depenen i quins paquets exporten. Les declaracions de dependència explícites milloren la integritat del codi, facilitant el raonament sobre les aplicacions grans i les dependències entre els components del programari.
La declaració del mòdul es col·loca en un fitxer anomenat module-info.java a l'arrel de la jerarquia de fitxers font del mòdul. El JDK verificarà les dependències i les interaccions entre mòduls tant en temps de compilació com en temps d'execució.
Per exemple, la següent declaració del mòdul declara que el mòdul com.foo.bar depèn d'un altre mòdul com.foo.baz i exporta els paquets següents: com.foo.bar.alpha i com.foo.bar.beta :
Els membres públics dels paquets com.foo.bar.alpha i com.foo.bar.beta seran accessibles per mòduls dependents. Els membres privats són inaccessibles fins i tot a través d'un mitjà com la reflexió. Tingueu en compte que a les versions de Java de la 9 a la 16, si aquest "accés il·legal" està permès de facto depèn de la configuració de la línia d'ordres.
El propi JDK s'ha modular en Java 9.

## Referències

* ↑ «Java Platform Module System (JSR 376)» (en anglès). Oracle Corporation. [Consulta: 2 juliol 2018].
* ↑ «Project Jigsaw» (en anglès). Oracle Corporation. [Consulta: 29 novembre 2015].
* ↑ Mark Reinhold. «It's time for … Plan B» (en anglès). Oracle Corporation, 20-09-2009. [Consulta: 21 juny 2017].
* ↑ «JDK 9» (en anglès). Oracle Corporation. [Consulta: 24 febrer 2016].
* ↑ «Java 9: Release date and new features» (en anglès). techworld.com, 21-07-2017. Arxivat de l'original el 2017-12-07. [Consulta: 18 novembre 2017].
* ↑ «Project Jigsaw» (en anglès). Oracle Corporation. [Consulta: 29 novembre 2015].
* ↑ «jlink: The Java Linker (JSR 282)» (en anglès). Oracle Corporation. [Consulta: 12 març 2016].
* ↑ «Java Platform Module System (JSR 376)» (en anglès). Oracle Corporation. [Consulta: 29 novembre 2015].
* ↑ «JEP 238: Multi-Release JAR Files» (en anglès). Oracle Corporation. [Consulta: 31 juliol 2017].
* ↑ «JEP 253: Prepare JavaFX UI Controls & CSS APIs for Modularization» (en anglès). Oracle Corporation. [Consulta: 31 juliol 2017].
* ↑ «JEP 260: Encapsulate Most Internal APIs» (en anglès). Oracle Corporation. [Consulta: 31 juliol 2017].
* ↑ «JEP 275: Modular Java Application Packaging» (en anglès). Oracle Corporation. [Consulta: 31 juliol 2017].
* ↑ Mark Reinhold. «The State of the Module System» (en anglès). Oracle Corporation, 08-03-2016. [Consulta: 18 febrer 2017].
* ↑ «JEP 396: Strongly Encapsulate JDK Internals by Default» (en anglès). [Consulta: 6 febrer 2021].
* ↑ «JDK Module Summary» (en anglès). Oracle Corporation, 24-06-2016. Arxivat de l'original el 2015-12-08. [Consulta: 18 febrer 2017].