Jakarta EE
Qué es la edición empresarial de Java hoy, cómo se llegó de J2EE a Jakarta EE y por qué cambiaron los paquetes, en qué perfiles se reparte, qué es un servidor de aplicaciones con sus contenedores, cómo se organizan las capas y qué servicios ofrece la plataforma.
De J2EE a Java EE y de Java EE a Jakarta EE
AMPLIADO (el enunciado oficial del tema es literalmente «Java EE / Jakarta EE», así que el cambio de nombre y sus consecuencias no pueden faltar). La edición empresarial de Java ha cambiado de nombre y de propietario dos veces, y el examen pregunta por ello.
| Etapa | Nombre | Quién la gobierna |
|---|---|---|
| Primera | J2EE | Sun Microsystems |
| Segunda | Java EE | Oracle, tras comprar Sun |
| Actual | Jakarta EE | Eclipse Foundation, tras la donación de Oracle |
La donación tuvo una consecuencia que no es cosmética. Oracle cedió el código y las especificaciones, pero conservó la marca «Java», de modo que la plataforma tuvo que renombrarse y, con ella, sus paquetes: lo que se llamaba javax pasó a llamarse jakarta. El cambio se hizo efectivo en Jakarta EE 9 y obliga a tocar los ficheros fuente al migrar una aplicación antigua, porque cambian las importaciones.
// aplicación antigua, Java EE
import javax.servlet.http.HttpServlet;
import javax.persistence.Entity;
// la misma aplicación, Jakarta EE 9 o posterior
import jakarta.servlet.http.HttpServlet;
import jakarta.persistence.Entity;Las especificaciones ya no se elaboran con el proceso de Oracle, sino con el propio de la fundación, el JESP (Jakarta EE Specification Process), que es abierto y en el que participan los fabricantes que después implementan la plataforma.
Solo se renombraron los paquetes de la edición empresarial. En Java SE siguen existiendo javax.sql, javax.xml.parsers o javax.naming: escribir «jakarta.sql» es un error, no una modernización.
Para el examen
La secuencia: J2EE (Sun), Java EE (Oracle) y Jakarta EE (Eclipse Foundation)
Por qué cambió el paquete: Oracle conservó la marca Java
Cambio de javax a jakarta: en Jakarta EE 9
En Java SE: los paquetes siguen siendo javax
Los perfiles de Jakarta EE y MicroProfile
La plataforma no se entrega en un solo bloque. Un servidor no tiene por qué implementarlo todo: puede certificarse para un perfil, que es un subconjunto de especificaciones pensado para un tipo de aplicación. Así una aplicación sencilla no arrastra el peso de servicios que no va a usar.
| Perfil | Qué incluye | Para qué |
|---|---|---|
| Platform | La plataforma completa, con todas las especificaciones | Aplicaciones empresariales que necesitan transacciones distribuidas, mensajería y componentes de negocio |
| Web Profile | Un subconjunto centrado en la web, con un entorno de ejecución más ligero | Aplicaciones web corrientes |
| Core Profile | El más ligero. No lleva Servlet, pero sí servicios REST e inyección de dependencias | Servicios pequeños que hablan REST y arrancan rápido |
Junto a la plataforma existe MicroProfile, un conjunto de especificaciones complementarias orientadas a microservicios: comprobaciones de salud, métricas, tolerancia a fallos, configuración externa, autenticación con tokens y documentación de la API. Se apoya en el Core Profile, de modo que no es una alternativa a Jakarta EE sino una capa que se le añade cuando la aplicación se despliega como un conjunto de servicios pequeños en lugar de como una aplicación única.
Para el examen
Platform: el perfil completo
Web Profile: la parte web
Core Profile: el más ligero: sin Servlet, pero con REST e inyección
MicroProfile: añade sobre el Core salud, métricas y tolerancia a fallos
El servidor de aplicaciones y sus contenedores
Jakarta EE es un conjunto de especificaciones, no un programa. Quien las implementa es el servidor de aplicaciones, y ahí está la idea central de todo el subtema: la aplicación no se ejecuta sola, se despliega dentro de un servidor que le da hecho lo que necesita. El programador escribe componentes y el servidor los crea, los llama, los vigila y los destruye. Ese reparto tiene nombre: inversión del control.
Dentro del servidor hay contenedores, que son los entornos donde viven los componentes. El contenedor web sabe de HTTP: recibe la petición, decide a qué componente corresponde y llama al código Java, y es donde se alojan las piezas de presentación. El contenedor de EJB alberga los componentes de negocio y les aporta transacciones, seguridad y concurrencia sin que haya que programarlas.
Que la plataforma sea una especificación tiene una consecuencia práctica muy visible: hay varios productos compatibles entre los que elegir, y una aplicación bien escrita se puede llevar de uno a otro.
- Apache TomEE, la variante de Tomcat con los servicios empresariales añadidos.
- Eclipse GlassFish, la implementación de referencia.
- WildFly y su versión con soporte comercial, JBoss Enterprise Application Platform, de Red Hat.
- IBM WebSphere Liberty.
- Oracle WebLogic Server. Aparece a veces citado como «BEA WebLogic»: BEA fue la empresa que lo creó, comprada por Oracle en 2008.
- Payara, derivado de GlassFish con soporte comercial.
Un servidor web y un servidor de aplicaciones no son lo mismo. El primero sirve contenido por HTTP; el segundo implementa además las especificaciones de la plataforma y ofrece transacciones, mensajería, persistencia y seguridad a los componentes que aloja.
Para el examen
Qué es Jakarta EE: una especificación
Quién la implementa: el servidor de aplicaciones: WildFly, GlassFish, TomEE, WebLogic, Payara o WebSphere Liberty
Contenedores: el web y el de EJB
Cómo se llama ese reparto: inversión del control
Las capas y sus componentes
Una aplicación Jakarta EE se organiza en capas, y cada capa tiene sus componentes. Los componentes son las piezas que programa el desarrollador; los servicios, que se ven en el punto siguiente, son lo que le da hecho el servidor.
En la capa de presentación, la más cercana al cliente, viven los componentes que hablan HTTP y generan la respuesta.
- Servlet: recibe la petición HTTP y encamina el flujo hacia el resto de la aplicación. Es el componente de control.
- Filtro: se coloca delante de los servlets y trata aspectos transversales, como comprimir, validar o comprobar la autenticación.
- Jakarta Pages (las clásicas JSP): una página HTML en la que se intercalan trozos de código Java y objetos predefinidos.
- JSTL, la biblioteca de etiquetas estándar: sustituye ese código Java incrustado por etiquetas, de modo que la página vuelve a parecer una página.
- Jakarta Faces (JSF): un marco de componentes de interfaz ya construidos, que se colocan en la página como etiquetas y llevan asociado su propio comportamiento.
En la capa de negocio viven los Enterprise Beans (EJB), que son los componentes donde se programa la lógica de la aplicación. Los de sesión son los habituales: el servidor garantiza que sus métodos se ejecuten dentro de una transacción, de manera que si algo falla se deshace todo el trabajo sin escribir una línea para ello. Los hay sin estado, que no recuerdan nada entre llamadas y por eso el servidor puede reutilizar cualquier instancia para cualquier cliente, con estado, que sí guardan información entre llamadas de un mismo cliente, y de instancia única.
Hay un segundo tipo de bean que conviene distinguir: el dirigido por mensajes. En lugar de esperar a que alguien lo llame, se queda escuchando una cola de mensajes, y cuando llega uno el contenedor lo despierta y le pasa el contenido. Es la forma de programar procesos asíncronos: quien envía el mensaje no espera respuesta y sigue con lo suyo. Todos los servidores de la plataforma traen un gestor de colas incorporado.
La tercera vía de entrada a la capa de negocio son los servicios web, que exponen funcionalidad para que la consuman otras aplicaciones, en sus dos estilos: SOAP y REST.
Para el examen
Capa de presentación: servlet, filtros, Jakarta Pages (JSP), JSTL y Jakarta Faces
EJB de sesión: sin estado, con estado o único
Dónde los ejecuta el servidor: dentro de una transacción
EJB dirigidos por mensajes: escuchan una cola
Los servicios que ofrece la plataforma
Además de definir los componentes, la plataforma define servicios: capacidades que el servidor tiene la obligación de ofrecer y que la aplicación se limita a usar. Esta es la lista que hay que reconocer, con la sigla histórica por la que se sigue preguntando y el nombre actual, ya sin la marca Java.
| Sigla histórica | Nombre actual | Qué resuelve |
|---|---|---|
| JTA | Jakarta Transactions | Transacciones distribuidas: varias operaciones sobre varias bases de datos que confirman o se deshacen juntas |
| JNDI | Jakarta Naming (interfaz de nombres y directorio) | Un árbol de nombres donde el servidor publica los objetos que crea, para que la aplicación los busque en vez de construirlos |
| JPA | Jakarta Persistence | Persistencia de alto nivel: correspondencia entre objetos y tablas |
| JDBC | Se mantiene en Java SE | Persistencia de bajo nivel: SQL escrito a mano contra la base de datos |
| JMS | Jakarta Messaging | Colas de mensajes para comunicación asíncrona |
| JSON-P | Jakarta JSON Processing | Lectura y escritura de documentos JSON |
| JAX-WS | Jakarta XML Web Services | Servicios web de estilo SOAP |
| JAX-RS | Jakarta RESTful Web Services | Servicios web de estilo REST |
| CDI | Jakarta Contexts and Dependency Injection | Inyección de dependencias: el servidor coloca en cada objeto las piezas que necesita |
| Jakarta MVC | Jakarta MVC | Modelo, vista y controlador basado en peticiones sobre la capa REST |
| Jakarta NoSQL | Jakarta NoSQL | Acceso homogéneo a bases de datos no relacionales |
La inyección de dependencias merece un momento aparte porque es la que explica el resto. Un objeto declara qué necesita y el contenedor se lo entrega ya construido, en lugar de que el objeto lo cree por su cuenta. De ahí sale la frase que resume la plataforma: la aplicación no hace el new, lo hace el servidor.
Para el examen
JTA y JNDI: transacciones y nombres
JPA y JMS: persistencia y mensajería
JAX-WS y JAX-RS: servicios SOAP y servicios REST
CDI: inyección de dependencias
Principio común: la aplicación no crea sus objetos: los crea el servidor
Los objetos principales de cada servicio
Cada servicio se usa a través de unos pocos objetos o anotaciones, y son justamente los que aparecen en las preguntas de detalle. Casi todos los crea el servidor y la aplicación se limita a pedirlos.
| Servicio | Por dónde se usa |
|---|---|
| Transacciones | UserTransaction, con sus métodos de confirmación y de deshacer |
| Nombres y directorio | InitialContext y su método de búsqueda por nombre. En ese árbol están los orígenes de datos, las colas, los EJB y las configuraciones de correo |
| JDBC | Driver y DataSource como punto de entrada, Connection, Statement, PreparedStatement, CallableStatement para procedimientos almacenados, y ResultSet, que es un cursor sobre el resultado |
| Mensajería | MessageListener con su método de recepción; una cola entrega el mensaje a un único consumidor y un tema lo difunde a todos los suscritos |
| Persistencia | EntityManager, y las anotaciones que describen la entidad y su correspondencia con la tabla |
| Servicios SOAP | Anotaciones sobre la clase y sobre los métodos y parámetros que se publican |
| Servicios REST | Anotaciones de ruta y de verbo HTTP sobre los métodos |
| Inyección de dependencias | La anotación de inyección, más las que fijan el alcance del objeto y su nombre |
Dos matices que se preguntan con frecuencia. El primero: una sentencia preparada no solo se compila una vez y se reutiliza, sino que separa la sentencia de los valores, y por eso es la defensa estándar contra la inyección de SQL. El segundo: con una cola, muchos productores pueden publicar pero cada mensaje lo consume uno solo; para que un mismo mensaje llegue a varios receptores hace falta un tema.
Para el examen
Sentencia preparada: separa la sentencia de los valores
Por qué importa: es la defensa estándar contra la inyección de SQL
Cola frente a tema: un solo receptor consume cada mensaje frente a difundirlo a todos los suscritos