Sistema de módulo de plataforma Java - Java Platform Module System
El sistema de módulo de plataforma de Java especifica un formato de distribución para las colecciones de Java de código y recursos asociados. También especifica un repositorio para almacenar estas colecciones, o módulos , e identifica cómo se pueden descubrir, cargar y verificar su integridad. Incluye características como espacios de nombres con el objetivo de corregir algunas de las deficiencias en el formato JAR existente , especialmente el JAR Hell , que puede generar problemas como classpath y problemas de carga de clases.
El Java Module System se estaba desarrollando inicialmente bajo el Java Community Process como JSR 277 y estaba programado para su lanzamiento con Java 7.
Posteriormente, JSR 277 se suspendió y se creó Project Jigsaw para modularizar el JDK. Este JSR fue reemplazado por JSR 376 (Java Platform Module System).
Project Jigsaw se diseñó originalmente para Java 7 (2011), pero se aplazó a Java 8 (2014) como parte del Plan B, y nuevamente se aplazó a una versión de Java 9 en 2017. Java 9, incluido el Java Module System, se lanzó el 21 de septiembre. 2017.
Arquitectura
El Java Module System implementado en Java 9 incluye los siguientes JEP y JSR (solicitud de especificación de Java) :
- JEP 200: El JDK modular: Defina una estructura modular para el JDK
- JEP 201: Código fuente modular: reorganice el código fuente JDK en módulos, mejore el sistema de compilación para compilar módulos y haga cumplir los límites de los módulos en el momento de la compilación
- JEP 220: Imágenes modulares en tiempo de ejecución: reestructura las imágenes en tiempo de ejecución de JDK y JRE para acomodar módulos y mejorar el rendimiento, la seguridad y la capacidad de mantenimiento
- JEP 261: Sistema de módulos: Implementar el sistema de módulos de la plataforma Java
- JEP 282: Java Linker: cree una herramienta que pueda ensamblar y optimizar un conjunto de módulos y sus dependencias en una imagen personalizada en tiempo de ejecución
- JSR 376: Sistema de módulo de plataforma Java
Además, se han agregado varias otras características de JDK 9 para facilitar la transición al sistema de módulos:
- JEP 238: Archivos JAR de versiones múltiples: amplíe el formato de archivo JAR para permitir que varias versiones de archivos de clases específicas de Java coexistan en un solo archivo.
- JEP 253: Preparar controles de interfaz de usuario de JavaFX y API de CSS para la modularización: definir API públicas para las funcionalidades de JavaFX que actualmente solo están disponibles a través de API internas y se volverían inaccesibles debido a la modularización.
- JEP 260: Encapsular la mayoría de las API internas: haga que la mayoría de las API internas del JDK sean inaccesibles de forma predeterminada, pero deje accesibles algunas API internas críticas y ampliamente utilizadas, hasta que existan reemplazos compatibles para todas o la mayoría de sus funciones.
- JEP 275: Empaquetado de aplicaciones Java modular: El empaquetador Java evolucionará para JDK 9, haciéndolo consciente de los módulos, permitiendo por ejemplo empaquetar un módulo y todos los módulos de los que depende.
Propiedades de los módulos
Los módulos son una nueva forma de agrupar código. A diferencia de los archivos Jar , los módulos declaran explícitamente de qué módulos dependen y qué paquetes exportan. Las declaraciones de dependencia explícitas mejoran la integridad del código, al facilitar el razonamiento sobre aplicaciones grandes y las dependencias entre componentes de software.
Por ejemplo, la siguiente declaración de módulo declara que el módulo com.foo.bar depende de otro módulo com.foo.baz y exporta los siguientes paquetes: com.foo.bar.alpha y com.foo.bar.beta :
module com.foo.bar {
requires com.foo.baz;
exports com.foo.bar.alpha;
exports com.foo.bar.beta;
}
Los miembros públicos de los paquetes com.foo.bar.alpha y com.foo.bar.beta serán accesibles mediante módulos dependientes. Los miembros privados son inaccesibles incluso a través de un medio como la reflexión , aunque si el 'acceso ilegal' está permitido de facto depende de la configuración de la línea de comandos.
A diferencia del formato de archivo Jar, el módulo describirá estas dependencias en una declaración de módulo que se colocará en un archivo llamado module-info.java en la raíz de la jerarquía del archivo fuente del módulo. El JDK podrá verificar las dependencias e interacciones entre los módulos tanto en tiempo de compilación como en tiempo de ejecución. El propio JDK se ha modularizado en Java 9 .
Vínculos con OSGi
El Java Module System no tiene la intención de admitir todas las funcionalidades que la plataforma OSGi admite actualmente (por ejemplo, el modelo de ciclo de vida y el registro de servicios). Sin embargo, Java Module System admitirá funciones que no son compatibles con OSGi, como la modularidad en tiempo de compilación y el soporte integrado para bibliotecas nativas. En 2016 se publicaron un par de artículos que exploran cómo Java Module System y OSGi podrían interoperar. Estos se pueden encontrar en InfoQ y también en OSGi Alliance Blog.