Conceptos básicos de los módulos de Java
Introducción a los módulos de Java
Los módulos de Java, introducidos en Java 9, representan un cambio fundamental en el enfoque de Java para gestionar las dependencias y mejorar el encapsulamiento. Proporcionan una forma más estructurada de organizar y controlar el acceso entre diferentes partes de una aplicación.
Conceptos fundamentales de los módulos de Java
¿Qué es un módulo de Java?
Un módulo de Java es una colección nombrada y auto-descriptiva de código y datos. Declara explícitamente:
- Qué código contiene
- Qué código externo depende
- Qué código pone a disposición de otros módulos
Características clave de los módulos
Característica |
Descripción |
Dependencias explícitas |
Los módulos deben declarar sus dependencias |
Encapsulamiento fuerte |
Visibilidad controlada de los paquetes internos |
Mejora de rendimiento |
Mejor optimización en tiempo de ejecución |
Declaración de módulos
Un módulo se define mediante un archivo especial module-info.java
ubicado en la raíz del módulo:
module com.example.mymodule {
// Module directives go here
requires java.base; // Implicit requirement
requires java.sql; // Explicit dependency
exports com.example.api; // Packages visible to other modules
exports com.example.services to com.example.client; // Restricted exports
}
Tipos de módulos
graph TD
A[Module Types] --> B[Named Modules]
A --> C[Automatic Modules]
A --> D[Unnamed Modules]
B --> B1[Explicitly defined with module-info.java]
C --> C1[Derived from classpath JARs]
D --> D1[Legacy code without module information]
Módulos nombrados
- Definidos explícitamente con un
module-info.java
- Control total sobre las dependencias y las exportaciones
Módulos automáticos
- Creados a partir de archivos JAR existentes en el classpath
- Reciben automáticamente un nombre de módulo basado en el nombre del archivo JAR
Módulos sin nombre
- Representan código heredado o aplicaciones basadas en el classpath
- Proporcionan compatibilidad hacia atrás
Beneficios de los módulos de Java
- Mejor encapsulamiento
- Dependencias explícitas
- Mejora de la seguridad
- Mejora del rendimiento
- Organización más clara del código
Ejemplo práctico
A continuación, se muestra una estructura de módulo simple para un proyecto LabEx:
// module-info.java in src directory
module com.labex.moduleexample {
requires java.base;
requires java.logging;
exports com.labex.core.api;
exports com.labex.core.services;
}
Compilación y ejecución de módulos
En Ubuntu 22.04, compila y ejecuta módulos utilizando:
## Compile modules
javac -d mods --module-source-path src $(find src -name "*.java")
## Run a specific module
java --module-path mods -m com.labex.moduleexample/com.labex.core.Main
Desafíos comunes
- Migrar proyectos existentes a módulos
- Gestionar gráficos de dependencias complejos
- Equilibrar el encapsulamiento con la flexibilidad