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.

Ver también

Referencias

enlaces externos