Formato de distribución de código y recursos Java
El sistema de módulos de la plataforma Java [1] especifica un formato de distribución para colecciones de código Java y recursos asociados. También especifica un repositorio para almacenar estas colecciones, o módulos , e identifica cómo se pueden descubrir, cargar y comprobar en cuanto a su integridad. Incluye características como espacios de nombres con el objetivo de corregir algunas de las deficiencias del formato JAR existente , especialmente el JAR Hell , que puede provocar problemas como problemas de carga de clases y rutas de clases.
El sistema de módulos Java se desarrolló inicialmente bajo el Proceso de la Comunidad Java como JSR 277 y estaba previsto que se lanzara con Java 7.
Posteriormente, se suspendió la JSR 277 y se creó el Proyecto Jigsaw [2] para modularizar el JDK. Esta JSR fue reemplazada por la JSR 376 (Java Platform Module System).
El proyecto Jigsaw fue originalmente pensado para Java 7 (2011), pero fue pospuesto para Java 8 (2014) como parte del Plan B, [3] y nuevamente pospuesto para un lanzamiento de Java 9 en 2017. [4] Java 9, incluido el sistema de módulos Java, fue lanzado el 21 de septiembre de 2017. [5]
Arquitectura
El sistema de módulos Java implementado en Java 9 incluye los siguientes JEP y JSR (solicitud de especificación Java) : [2]
- JEP 200: El JDK modular: definir una estructura modular para el JDK
- JEP 201: Código fuente modular: reorganizar el código fuente del JDK en módulos, mejorar el sistema de compilación para compilar módulos y hacer cumplir los límites de los módulos en el momento de la compilación.
- JEP 220: Imágenes de tiempo de ejecución modulares: reestructurar las imágenes de 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: El enlazador de Java: crea una herramienta que pueda ensamblar y optimizar un conjunto de módulos y sus dependencias en una imagen de tiempo de ejecución personalizada [6]
- JSR 376: Sistema de módulos de la plataforma Java [7]
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 múltiples versiones: amplíe el formato de archivo JAR para permitir que múltiples versiones de archivos de clase específicas de cada versión de Java coexistan en un solo archivo. [8]
- JEP 253: Preparar controles de interfaz de usuario de JavaFX y API 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 que se volverían inaccesibles debido a la modularización. [9]
- JEP 260: Encapsular la mayoría de las API internas: hacer que la mayoría de las API internas del JDK sean inaccesibles de forma predeterminada, pero dejar accesibles unas pocas API internas críticas y ampliamente utilizadas, hasta que existan reemplazos compatibles para todas o la mayor parte de su funcionalidad. [10]
- JEP 275: Empaquetado modular de aplicaciones Java: El empaquetador Java evolucionará para JDK 9, haciéndolo consciente de los módulos, lo que permitirá, por ejemplo, empaquetar un módulo y todos los módulos de los que depende. [11]
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. [12] 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.
La declaración del módulo se coloca en un archivo llamado module-info.java en la raíz de la jerarquía de archivos fuente del módulo. El JDK verificará las dependencias e interacciones entre los módulos tanto en tiempo de compilación como en tiempo de ejecución.
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 :
módulo com.foo.bar { requiere com.foo.baz; exporta com.foo.bar.alpha; exporta com.foo.bar.beta;}
Los miembros públicos de los paquetes com.foo.bar.alpha y com.foo.bar.beta serán accesibles para los módulos dependientes. Los miembros privados son inaccesibles incluso a través de un medio como la reflexión . Tenga en cuenta que en las versiones de Java 9 a 16, si dicho "acceso ilegal" está permitido de facto depende de una configuración de la línea de comandos. [13]
El propio JDK ha sido modularizado en Java 9. [ 14]
Enlaces con OSGi
El sistema de módulos Java no pretende soportar todas las funcionalidades que la plataforma OSGi actualmente soporta (por ejemplo, el modelo de ciclo de vida y el registro de servicios). Sin embargo, el sistema de módulos Java soportará funciones que no son soportadas por OSGi, como la modularidad en tiempo de compilación y el soporte integrado para bibliotecas nativas. [15] En 2016 se publicaron un par de artículos que exploraban cómo el sistema de módulos Java y OSGi podrían interoperar. Estos se pueden encontrar en InfoQ [16] y también en el blog de OSGi Alliance. [17]
Véase también
Referencias
- ^ "Sistema de módulos de la plataforma Java (JSR 376)". Oracle Corporation . Consultado el 2 de julio de 2018 .
- ^ ab "Proyecto Jigsaw". Oracle Corporation . Consultado el 29 de noviembre de 2015 .
- ^ Mark Reinhold (20 de septiembre de 2009). "Es hora de... Plan B". Oracle Corporation . Consultado el 21 de junio de 2017 .
- ^ "JDK 9". Oracle Corporation . Consultado el 24 de febrero de 2016 .
- ^ "Java 9: fecha de lanzamiento y nuevas características". techworld.com. 2017-07-21 . Consultado el 2017-11-18 .
- ^ "jlink: El enlazador de Java (JSR 282)". Oracle Corporation . Consultado el 12 de marzo de 2016 .
- ^ "Sistema de módulos de la plataforma Java (JSR 376)". Oracle Corporation . Consultado el 29 de noviembre de 2015 .
- ^ "JEP 238: Archivos JAR de múltiples versiones". Oracle Corporation . Consultado el 31 de julio de 2017 .
- ^ "JEP 253: Preparar controles de interfaz de usuario de JavaFX y API CSS para la modularización". Oracle Corporation . Consultado el 31 de julio de 2017 .
- ^ "JEP 260: Encapsular la mayoría de las API internas". Oracle Corporation . Consultado el 31 de julio de 2017 .
- ^ "JEP 275: Empaquetado modular de aplicaciones Java". Oracle Corporation . Consultado el 31 de julio de 2017 .
- ^ Mark Reinhold (8 de marzo de 2016). "El estado del sistema de módulos". Oracle Corporation . Consultado el 18 de febrero de 2017 .
- ^ "JEP 396: Encapsular fuertemente los componentes internos del JDK de manera predeterminada" . Consultado el 6 de febrero de 2021 .
- ^ "Resumen del módulo JDK". Oracle Corporation . 24 de junio de 2016. Archivado desde el original el 8 de diciembre de 2015. Consultado el 18 de febrero de 2017 .
- ^ Mark Reinhold (24 de agosto de 2012). "Project Jigsaw: Late to the train: The Q&A" (Proyecto Jigsaw: Tarde para el tren: Preguntas y respuestas). Oracle Corporation . Consultado el 29 de noviembre de 2015 .
- ^ "Java 9, OSGi y el futuro de la modularidad". InfoQ . Consultado el 26 de septiembre de 2016 .
- ^ "Capas de módulos Java y paquetes OSGi". OSGi Alliance . Consultado el 1 de agosto de 2016 .
Enlaces externos
- JSR277
- JSR 294
- JSR376
- Proyecto Jigsaw
- El estado del sistema de módulos
- Sistema de módulos de la plataforma Java: Resumen del problema