B3-T5: Java SE y Jakarta EE
Java es el lenguaje más preguntado del bloque de Desarrollo. Dominar la relación JDK/JRE/JVM, los modificadores de acceso y las Collections cubre la mitad de las preguntas. En la parte EE, el foco está en Servlets, JPA y el modelo de capas.
HISTORIA Y EVOLUCIÓN
Fuente: Oracle Java SE Documentation (docs.oracle.com/javase) — dominio público. Timeline basado en JSRs y JEPs públicos de OpenJDK.
| Año | Versión | Hito clave |
|---|---|---|
| 1995 | JDK 1.0 | Sun Microsystems publica Java. Lema: "Write Once, Run Anywhere" (WORA) |
| 1998 | J2SE 1.2 | Se introduce Collections Framework (java.util), Swing |
| 2004 | J2SE 5.0 | Generics, anotaciones, autoboxing, enums, for-each, varargs |
| 2006 | Java SE 6 | Scripting API (JSR 223), mejoras rendimiento. Sun libera OpenJDK |
| 2011 | Java SE 7 | try-with-resources, diamond operator (<>), switch con String, NIO.2 |
| 2014 | Java SE 8 (LTS) | Lambdas, Stream API, Optional, java.time, default methods en interfaces |
| 2017 | Java SE 9 | Módulos (JPMS — Project Jigsaw), JShell (REPL) |
| 2018 | Java SE 11 (LTS) | var en lambdas, HTTP Client estándar, eliminación de Java EE del JDK |
| 2021 | Java SE 17 (LTS) | Sealed classes, pattern matching para instanceof, records |
| 2023 | Java SE 21 (LTS) | Virtual Threads (Project Loom), sequenced collections, pattern matching en switch |
Tip examen: Las versiones LTS (8, 11, 17, 21) son las más preguntadas. Los ciclos de release cambiaron a cada 6 meses desde Java 9 (2017).
ECOSISTEMA JAVA: JDK, JRE, JVM
Fuente: JVM Specification (JSR 924), Java SE Specification (docs.oracle.com). Conceptos fundamentales de la plataforma.
| Componente | Qué es | Contiene | Quién lo usa |
|---|---|---|---|
| JVM | Máquina virtual que ejecuta bytecode | Class Loader, JIT compiler, Garbage Collector, áreas de memoria | Interno — el usuario no lo invoca directamente |
| JRE | Entorno de ejecución | JVM + bibliotecas estándar (rt.jar) | Usuario final que solo ejecuta .jar |
| JDK | Kit completo de desarrollo | JRE + compilador (javac) + herramientas (jar, jdb, javadoc) | Desarrollador |
Pregunta clásica: JDK ⊃ JRE ⊃ JVM. El JDK incluye al JRE, que incluye a la JVM. Desde Java 11, Oracle eliminó el JRE como distribución separada.
HERRAMIENTAS DEL JDK
| Herramienta | Función | Ejemplo de uso |
|---|---|---|
javac | Compilador: .java → .class (bytecode) | javac MiClase.java |
java | Lanzador de la JVM | java MiClase o java -jar app.jar |
jar | Empaquetador de archivos | jar cf app.jar *.class |
javadoc | Generador de documentación HTML | javadoc -d docs src/*.java |
jdb | Depurador | jdb MiClase |
jshell | REPL interactivo (desde Java 9) | jshell |
jlink | Crea runtime personalizado (módulos) | jlink --add-modules java.base --output myrt |
keytool | Gestión de certificados y keystores | keytool -genkeypair -alias mikey |
MODELO DE MEMORIA DE LA JVM
Fuente: JVM Specification §2.5 (docs.oracle.com/javase/specs) — documento público.
| Área | Compartida | Contenido | Error asociado |
|---|---|---|---|
| Heap | Sí (todos los hilos) | Objetos y arrays (instancias creadas con new) | OutOfMemoryError |
| Stack | No (uno por hilo) | Frames de método: variables locales, operandos, puntero de retorno | StackOverflowError |
| Method Area | Sí | Metadatos de clase, constantes, código de métodos. Incluye el String Pool | OutOfMemoryError |
| PC Register | No (uno por hilo) | Dirección de la instrucción actual | — |
| Native Method Stack | No | Frames de métodos nativos (JNI) | StackOverflowError |
GARBAGE COLLECTOR (GC)
| Colector | Tipo | Características | Activación |
|---|---|---|---|
| Serial GC | Stop-the-world, un hilo | Sencillo, para apps pequeñas | -XX:+UseSerialGC |
| Parallel GC | Stop-the-world, multi-hilo | Throughput alto | -XX:+UseParallelGC |
| G1 GC | Regiones, concurrente parcial | Default desde Java 9. Divide heap en regiones de ~1-32 MB | -XX:+UseG1GC |
| ZGC | Concurrente, baja latencia | Pausas < 1 ms. Desde Java 15 (production) | -XX:+UseZGC |
| Shenandoah | Concurrente, baja latencia | Similar a ZGC, de Red Hat | -XX:+UseShenandoahGC |
Tip examen: El GC no puede forzarse. System.gc() es solo una sugerencia. Los objetos sin referencias son candidatos a recolección.
ORIENTACIÓN A OBJETOS EN JAVA
Fuente: Java Language Specification (JLS) §8 — documento público de Oracle/OpenJDK.
| Pilar OOP | En Java | Mecanismo |
|---|---|---|
| Encapsulación | Ocultar estado interno | Modificadores de acceso + getters/setters |
| Herencia | Reutilizar código de una clase padre | extends (clase) / implements (interfaz) |
| Polimorfismo | Misma interfaz, distinto comportamiento | Sobreescritura (@Override) y sobrecarga |
| Abstracción | Definir contratos sin implementación | abstract class / interface |
HERENCIA EN JAVA
| Concepto | Mecanismo | Regla clave |
|---|---|---|
| Herencia simple | class Hijo extends Padre | Java NO soporta herencia múltiple de clases |
| Implementación múltiple | class A implements I1, I2 | Sí se permiten múltiples interfaces |
| Clase raíz | java.lang.Object | Toda clase hereda implícitamente de Object |
| Sobreescritura | @Override | Misma firma, no puede ser más restrictivo en acceso |
| Sobrecarga | Mismo nombre, distinta firma | Diferente número o tipo de parámetros |
| super | super.metodo() | Llama al método de la clase padre |
| this | this.campo | Referencia a la instancia actual |
MODIFICADORES DE ACCESO
| Modificador | Misma clase | Mismo paquete | Subclase (otro paquete) | Cualquier clase |
|---|---|---|---|---|
private | ✓ | ✗ | ✗ | ✗ |
| (default) — sin modificador | ✓ | ✓ | ✗ | ✗ |
protected | ✓ | ✓ | ✓ | ✗ |
public | ✓ | ✓ | ✓ | ✓ |
Pregunta frecuente: protected permite acceso desde subclases incluso en otro paquete. El acceso default (package-private) NO permite subclases de otro paquete.
OTROS MODIFICADORES
| Modificador | Sobre clase | Sobre método | Sobre variable |
|---|---|---|---|
static | Solo clases internas | Pertenece a la clase, no a instancias | Variable de clase compartida |
final | No se puede heredar | No se puede sobreescribir | Constante (no reasignable) |
abstract | No instanciable | Sin cuerpo, la subclase debe implementar | — |
synchronized | — | Solo un hilo a la vez | — |
volatile | — | — | Lectura/escritura directa a memoria principal |
transient | — | — | Excluida de serialización |
native | — | Implementado en código nativo (C/C++) | — |
strictfp | Aritmética IEEE 754 estricta | Aritmética IEEE 754 estricta | — |
TIPOS DE DATOS PRIMITIVOS
Fuente: JLS §4.2 — Primitive Types and Values.
| Tipo | Bits | Rango | Wrapper | Valor por defecto |
|---|---|---|---|---|
byte | 8 | -128 a 127 | Byte | 0 |
short | 16 | -32.768 a 32.767 | Short | 0 |
int | 32 | -2³¹ a 2³¹-1 | Integer | 0 |
long | 64 | -2⁶³ a 2⁶³-1 | Long | 0L |
float | 32 | IEEE 754 simple | Float | 0.0f |
double | 64 | IEEE 754 doble | Double | 0.0d |
char | 16 | 0 a 65.535 (Unicode UTF-16) | Character | '\u0000' |
boolean | ~1 | true / false | Boolean | false |
Tip examen: String NO es primitivo — es una clase inmutable. El autoboxing convierte automáticamente entre primitivos y wrappers (desde Java 5).
JAVA COLLECTIONS FRAMEWORK
Fuente: Java SE API Documentation (docs.oracle.com/javase), java.util package. JSR 166 para colecciones concurrentes.
| Interfaz | Orden | Duplicados | Implementaciones principales |
|---|---|---|---|
| List | Inserción (indexado) | Sí | ArrayList (array dinámico), LinkedList (doblemente enlazada), Vector (sincronizado, legacy) |
| Set | No garantizado | No | HashSet (hash), LinkedHashSet (inserción), TreeSet (ordenado natural) |
| Queue | FIFO (por defecto) | Sí | LinkedList, PriorityQueue (por prioridad), ArrayDeque |
| Deque | FIFO y LIFO | Sí | ArrayDeque (preferido como stack), LinkedList |
| Map | No garantizado | Claves únicas | HashMap, LinkedHashMap (inserción), TreeMap (clave ordenada), Hashtable (legacy, sincronizado) |
| Operación | ArrayList | LinkedList | HashSet | HashMap | TreeMap |
|---|---|---|---|---|---|
| Acceso por índice | O(1) | O(n) | — | — | — |
| Inserción al final | O(1) amort. | O(1) | — | — | — |
| Inserción en medio | O(n) | O(1)* | — | — | — |
| Búsqueda | O(n) | O(n) | O(1) | O(1) | O(log n) |
| Ordenado | No (preserva inserción) | No | No | No | Sí (natural) |
Pregunta clásica:HashMappermite una clave null y múltiples valores null.Hashtableno permite nulls.TreeMapno permite clave null.
COLECCIONES CONCURRENTES
| Clase | Reemplaza a | Mecanismo |
|---|---|---|
ConcurrentHashMap | Hashtable / Collections.synchronizedMap() | Bloqueo por segmentos (striped locking), lectura sin bloqueo |
CopyOnWriteArrayList | Vector / Collections.synchronizedList() | Copia el array en cada escritura; lectura sin bloqueo |
BlockingQueue | — | Productor-consumidor: put() bloquea si llena, take() si vacía |
ConcurrentLinkedQueue | — | Cola no bloqueante, lock-free (CAS) |
EXCEPCIONES
Fuente: JLS §11 — Exceptions. Jerarquía de java.lang.Throwable.
| Tipo | Clase base | Checked | Ejemplos | Obligatorio capturar |
|---|---|---|---|---|
| Checked | Exception (excl. RuntimeException) | Sí | IOException, SQLException, ClassNotFoundException | Sí (try-catch o throws) |
| Unchecked | RuntimeException | No | NullPointerException, ArrayIndexOutOfBoundsException, IllegalArgumentException | No (pero recomendable) |
| Error | Error | No | OutOfMemoryError, StackOverflowError | No (no recuperables) |
| Jerarquía |
|---|
Throwable → Error (JVM) + Exception → RuntimeException (unchecked) + checked exceptions |
Tip examen: try-with-resources (Java 7+) cierra automáticamente recursos que implementanAutoCloseable. El bloquefinallysiempre se ejecuta (exceptoSystem.exit()).
GENÉRICOS (GENERICS)
| Concepto | Sintaxis | Ejemplo |
|---|---|---|
| Clase genérica | class Box<T> | Box<String> b = new Box<>(); |
| Método genérico | <T> T metodo(T arg) | El tipo se infiere del argumento |
| Wildcard upper | ? extends Tipo | Acepta Tipo y subclases (lectura) |
| Wildcard lower | ? super Tipo | Acepta Tipo y superclases (escritura) |
| Type erasure | — | Los genéricos se eliminan en compilación; en runtime todo es Object |
Regla PECS: Producer Extends, Consumer Super. Si lees del genérico →extends. Si escribes →super.
LAMBDAS Y STREAM API (Java 8+)
Fuente: JSR 335 (Lambdas), java.util.stream package docs.
| Interfaz funcional | Método | Entrada → Salida | Uso típico |
|---|---|---|---|
Predicate<T> | test(T) | T → boolean | filter() |
Function<T,R> | apply(T) | T → R | map() |
Consumer<T> | accept(T) | T → void | forEach() |
Supplier<T> | get() | () → T | Lazy creation |
UnaryOperator<T> | apply(T) | T → T | replaceAll() |
BinaryOperator<T> | apply(T,T) | (T,T) → T | reduce() |
| Operación Stream | Tipo | Ejemplo |
|---|---|---|
filter() | Intermedia | stream.filter(x -> x > 5) |
map() | Intermedia | stream.map(String::toUpperCase) |
flatMap() | Intermedia | Aplana Stream de Streams |
sorted() | Intermedia (stateful) | stream.sorted(Comparator.reverseOrder()) |
distinct() | Intermedia (stateful) | Elimina duplicados |
collect() | Terminal | stream.collect(Collectors.toList()) |
reduce() | Terminal | stream.reduce(0, Integer::sum) |
forEach() | Terminal | stream.forEach(System.out::println) |
count() | Terminal | Número de elementos |
Los Streams son lazy: las operaciones intermedias no se ejecutan hasta que se invoca una operación terminal. Son de un solo uso.
HILOS (THREADS) Y CONCURRENCIA
Fuente:java.lang.ThreadAPI docs,java.util.concurrent(JSR 166), JMM (Java Memory Model — JLS §17).
| Forma de crear hilos | Código | Ventaja |
|---|---|---|
Extender Thread | class MiHilo extends Thread { run()... } | Simple pero impide herencia múltiple |
Implementar Runnable | class MiTask implements Runnable { run()... } | Preferido: permite implementar otras interfaces |
Implementar Callable<V> | class MiTask implements Callable<V> { call()... } | Devuelve resultado y lanza excepciones checked |
| Lambda + Executor | executor.submit(() -> { ... }) | Moderno, gestión de pool de hilos |
| Mecanismo | Qué hace | Cuándo usar |
|---|---|---|
synchronized | Monitor lock: solo un hilo ejecuta el bloque/método | Secciones críticas simples |
volatile | Variable visible inmediatamente a todos los hilos | Flags simples (no operaciones compuestas) |
ReentrantLock | Lock explícito con tryLock, timeout, fairness | Control avanzado |
AtomicInteger/Long | Operaciones atómicas sin locks (CAS) | Contadores, acumuladores |
wait()/notify() | Comunicación entre hilos | Productor-consumidor clásico |
ExecutorService | Pool de hilos gestionado | Preferido sobre crear hilos manualmente |
| Estado del hilo | Descripción |
|---|---|
| NEW | Creado pero no iniciado |
| RUNNABLE | Ejecutándose o listo para ejecutarse |
| BLOCKED | Esperando adquirir un monitor lock |
| WAITING | Esperando indefinidamente (wait(), join()) |
| TIMED_WAITING | Esperando con timeout (sleep(), wait(n)) |
| TERMINATED | Hilo finalizado |
VIRTUAL THREADS (Java 21+)
| Aspecto | Platform Thread | Virtual Thread |
|---|---|---|
| Mapeo | 1:1 con hilo del SO | M:N (multiplexado sobre carrier threads) |
| Coste | ~1 MB stack, costoso de crear | ~pocos KB, millones posibles |
| Creación | new Thread() | Thread.ofVirtual().start(() -> ...) |
| Ideal para | CPU-bound, cálculo intensivo | I/O-bound: HTTP, DB, ficheros |
| Bloqueo | Bloquea hilo del SO | Solo unmount del carrier; otro virtual thread ocupa su lugar |
LOGGING EN JAVA
| Framework | Tipo | Niveles (de menos a más grave) |
|---|---|---|
java.util.logging | Estándar JDK | FINEST, FINER, FINE, CONFIG, INFO, WARNING, SEVERE |
| SLF4J | Fachada (facade) | TRACE, DEBUG, INFO, WARN, ERROR |
| Log4j 2 | Implementación | TRACE, DEBUG, INFO, WARN, ERROR, FATAL |
| Logback | Implementación (nativa SLF4J) | TRACE, DEBUG, INFO, WARN, ERROR |
Tip examen: SLF4J es una fachada, no una implementación. Se combina con Logback o Log4j 2 como backend. Es el estándar de facto en proyectos Java empresariales.
HERRAMIENTAS DE BUILD
| Herramienta | Fichero config | Formato | Características |
|---|---|---|---|
| Maven | pom.xml | XML | Convention over configuration. Ciclo de vida: validate → compile → test → package → verify → install → deploy |
| Gradle | build.gradle | Groovy/Kotlin DSL | Incremental, caché de tareas, más rápido que Maven en builds grandes |
| Ant | build.xml | XML | Legacy. Tareas imperativos, sin convenciones |
| Concepto Maven | Descripción |
|---|---|
| GAV | groupId:artifactId:version — identificador único de un artefacto |
| Dependencias | Declaradas en <dependencies>; se descargan del repositorio central |
| Scope | compile (default), test, provided, runtime, system |
| Plugins | Extienden el ciclo de vida: maven-compiler-plugin, maven-surefire-plugin |
| Repositorios | Local (~/.m2), central (repo.maven.apache.org), remotos corporativos |
PERSISTENCIA: JDBC Y JPA
Fuente: JDBC API Specification (JSR 221), JPA Specification (JSR 338 / Jakarta Persistence 3.x). Documentos públicos.
| Aspecto | JDBC | JPA |
|---|---|---|
| Nivel | Bajo nivel — SQL directo | Alto nivel — ORM |
| Clase clave | Connection, PreparedStatement, ResultSet | EntityManager, @Entity, @Table |
| SQL | Escrito manualmente | Generado automáticamente (o JPQL) |
| Mapeo | Manual: rs.getString("col") | Automático: anotaciones @Column, @Id |
| Implementaciones | Drivers: MySQL Connector/J, PostgreSQL JDBC, ojdbc | Hibernate, EclipseLink, OpenJPA |
| Anotación JPA | Función |
|---|---|
@Entity | Marca clase como entidad JPA (= tabla) |
@Table(name="...") | Nombre de la tabla (si difiere del nombre de clase) |
@Id | Clave primaria |
@GeneratedValue | Generación automática de ID (IDENTITY, SEQUENCE, TABLE, AUTO) |
@Column | Mapeo columna-campo |
@OneToMany / @ManyToOne | Relaciones entre entidades |
@ManyToMany | Relación N:M (tabla intermedia) |
@NamedQuery | Consulta JPQL predefinida |
Pregunta recurrente: JPA es una especificación (no una librería). Hibernate es la implementación más usada. JPQL opera sobre entidades, no sobre tablas SQL directamente.
JAVA EE / JAKARTA EE
Desde 2017, Java EE fue transferido a la Eclipse Foundation y renombrado a Jakarta EE. Los paquetes cambiaron dejavax.*ajakarta.*a partir de Jakarta EE 9 (2020).
EVOLUCIÓN
| Año | Nombre | Versión | Hito |
|---|---|---|---|
| 1999 | J2EE | 1.2 | Servlets, JSP, EJB 1.1 |
| 2006 | Java EE | 5 | Anotaciones reemplazan XML, JPA 1.0, EJB 3.0 simplificado |
| 2013 | Java EE | 7 | WebSocket, JSON-P, Batch, Concurrency Utilities |
| 2017 | Java EE | 8 | Última versión Oracle. CDI 2.0, Servlet 4.0 (HTTP/2), JSON-B |
| 2019 | Jakarta EE | 8 | Misma funcionalidad que Java EE 8, paquetes javax.* |
| 2020 | Jakarta EE | 9 | Migración de namespace: javax.* → jakarta.* |
| 2022 | Jakarta EE | 10 | Core Profile para microservicios, CDI Lite |
| 2024 | Jakarta EE | 11 | Java SE 17+ mínimo, Virtual Threads support |
ARQUITECTURA DE CAPAS
| Capa | Responsabilidad | Tecnologías | Contenedor |
|---|---|---|---|
| Cliente | Interfaz de usuario | HTML/JS, Applets (obsoleto), Swing | Navegador / JVM cliente |
| Web | Control de peticiones HTTP | Servlets, JSP, JSF, JAX-RS | Servlet Container (Tomcat, Jetty) |
| Negocio | Lógica de negocio | EJB, CDI beans, ManagedBeans | EJB Container (WildFly, GlassFish) |
| Datos | Persistencia | JPA, JDBC, JCA | Proveedor de persistencia |
SERVLETS
Fuente: Jakarta Servlet 6.0 Specification (jakarta.ee). Componente fundamental de la capa web.
| Fase | Método | Cuándo |
|---|---|---|
| Carga | init(ServletConfig) | Primera petición (o al arrancar si load-on-startup) |
| Servicio | service(request, response) → delega a doGet(), doPost()... | Cada petición HTTP |
| Destrucción | destroy() | Al parar el servidor o redesplegar |
| Concepto Servlet | Descripción |
|---|---|
HttpServletRequest | Datos de la petición: parámetros, headers, sesión, cookies |
HttpServletResponse | Respuesta: status code, headers, body (PrintWriter / OutputStream) |
| Filter | Intercepta peticiones/respuestas (logging, auth, encoding). Cadena de filtros |
| Listener | Eventos del contexto o sesión (ServletContextListener, HttpSessionListener) |
web.xml | Descriptor de despliegue (deployment descriptor). Alternativa: anotaciones (@WebServlet) |
| Front Controller | Patrón: un servlet central despacha a controladores. Usado por Spring MVC (DispatcherServlet) |
EJB (Enterprise JavaBeans)
| Tipo EJB | Ciclo de vida | Estado | Uso típico |
|---|---|---|---|
| @Stateless | Pool gestionado por contenedor | Sin estado entre llamadas | Servicios de negocio, operaciones sin estado |
| @Stateful | Ligado a un cliente (sesión) | Mantiene estado conversacional | Carrito de compra, wizards multi-paso |
| @Singleton | Única instancia por aplicación | Estado compartido | Caché, configuración, init de app |
| @MessageDriven | Activado por mensajes JMS | Sin estado | Procesamiento asíncrono de mensajes |
Desde EJB 3.0 (Java EE 5), se usan anotaciones en lugar de descriptores XML complejos. EJB proporciona transacciones, seguridad y pooling automáticos.
CDI (Contexts and Dependency Injection)
| Anotación | Función |
|---|---|
@Inject | Inyección de dependencia (reemplaza new + lookups JNDI) |
@Named | Permite referenciar el bean desde EL (Expression Language) en JSF |
@RequestScoped | Bean vive una petición HTTP |
@SessionScoped | Bean vive toda la sesión del usuario |
@ApplicationScoped | Bean vive mientras dure la aplicación (singleton CDI) |
@Produces | Método factory que crea instancias inyectables |
@Qualifier | Desambigua cuando hay varias implementaciones de la misma interfaz |
JAX-RS (RESTful Web Services)
| Anotación | Función | Ejemplo |
|---|---|---|
@Path | Ruta base del recurso | @Path("/usuarios") |
@GET | Método HTTP GET | Obtener recurso |
@POST | Método HTTP POST | Crear recurso |
@PUT | Método HTTP PUT | Actualizar recurso completo |
@DELETE | Método HTTP DELETE | Eliminar recurso |
@PathParam | Parámetro de la URL | @Path("/{id}") getUser(@PathParam("id") long id) |
@QueryParam | Parámetro de query string | ?page=2 |
@Produces / @Consumes | Media type | @Produces("application/json") |
PRINCIPALES APIs JAKARTA EE
| API | Especificación | Función |
|---|---|---|
| Servlet | Jakarta Servlet 6.0 | Procesamiento de peticiones HTTP |
| JPA | Jakarta Persistence 3.1 | ORM — mapeo objetos a tablas |
| EJB | Jakarta Enterprise Beans 4.0 | Componentes de negocio con servicios del contenedor |
| CDI | Jakarta CDI 4.0 | Inyección de dependencias y contextos |
| JAX-RS | Jakarta RESTful WS 3.1 | APIs REST declarativas |
| JSF | Jakarta Faces 4.0 | Framework MVC para vistas (component-based) |
| JMS | Jakarta Messaging 3.1 | Mensajería asíncrona (colas y topics) |
| JSON-P | Jakarta JSON Processing 2.1 | Parseo/generación JSON a bajo nivel |
| JSON-B | Jakarta JSON Binding 3.0 | Serialización/deserialización JSON ↔ objetos |
| Bean Validation | Jakarta Validation 3.0 | Validación declarativa: @NotNull, @Size, @Email |
| JTA | Jakarta Transactions 2.0 | Transacciones distribuidas |
| JNDI | Java Naming and Directory Interface | Lookup de recursos: DataSources, EJBs, JMS queues |
SERVIDORES DE APLICACIONES
| Servidor | Tipo | Certificación | Proveedor |
|---|---|---|---|
| Apache Tomcat | Servlet Container | Solo Servlet + JSP | Apache Foundation (código abierto) |
| Eclipse Jetty | Servlet Container | Servlet + WebSocket | Eclipse Foundation |
| WildFly | Full Application Server | Jakarta EE completo | Red Hat (código abierto, antes JBoss AS) |
| Eclipse GlassFish | Full Application Server | Implementación de referencia Jakarta EE | Eclipse Foundation |
| IBM Open Liberty | Full Application Server | Jakarta EE completo | IBM (código abierto) |
| Oracle WebLogic | Full Application Server | Jakarta EE completo | Oracle (comercial) |
| IBM WebSphere | Full Application Server | Jakarta EE completo | IBM (comercial) |
Tip examen: Tomcat NO es un servidor de aplicaciones completo — solo implementa el Servlet Container. Para EJB, CDI, JMS, etc., necesitas WildFly, GlassFish o similar.
PROFILES JAKARTA EE
| Profile | Contenido | Uso |
|---|---|---|
| Full Platform | Todas las APIs Jakarta EE | Aplicaciones empresariales completas |
| Web Profile | Servlet, JSF, CDI, JPA, EJB Lite, Bean Validation, JTA | Aplicaciones web sin JMS ni conectores |
| Core Profile (desde EE 10) | CDI Lite, JAX-RS, JSON-P, JSON-B | Microservicios — subconjunto mínimo |
SPRING FRAMEWORK (Ecosistema complementario)
Spring no es parte de Jakarta EE, pero es el framework más usado en el ecosistema Java empresarial. Código abierto bajo licencia Apache 2.0.
| Módulo | Función | Equivalente Jakarta EE |
|---|---|---|
| Spring Core / IoC | Contenedor de inversión de control y DI | CDI |
| Spring MVC | Framework web MVC (DispatcherServlet) | JSF / JAX-RS |
| Spring Boot | Auto-configuración, servidor embebido, opinado | — |
| Spring Data JPA | Repositorios JPA simplificados | JPA |
| Spring Security | Autenticación y autorización | Jakarta Security |
| Spring Cloud | Microservicios: config, discovery, circuit breaker | MicroProfile |
NOVEDADES CLAVE POR VERSIÓN (RESUMEN EXAMEN)
| Versión | Novedades más preguntadas |
|---|---|
| Java 5 | Generics, for-each, enums, autoboxing, varargs, anotaciones |
| Java 7 | try-with-resources, diamond <>, switch String, NIO.2, multi-catch |
| Java 8 | Lambdas, Stream API, Optional, java.time, default methods, :: method references |
| Java 9 | Módulos (JPMS), JShell, List.of() / Map.of() (colecciones inmutables) |
| Java 11 | var en lambdas, String.isBlank(), HTTP Client, eliminación JEE del JDK |
| Java 14 | Records (preview), switch expressions, NullPointerException mejorado |
| Java 17 | Sealed classes (JEP 409), pattern matching instanceof. Records estables desde Java 16 (JEP 395) |
| Java 21 | Virtual Threads, sequenced collections, pattern matching switch, string templates (preview) |
FUENTES PÚBLICAS
Este resumen ha sido elaborado íntegramente a partir de fuentes de dominio público. No se ha utilizado material con copyright de terceros ni material de preparadores.
| Fuente | Tipo | Referencia |
|---|---|---|
| Java Language Specification (JLS) | Especificación | docs.oracle.com/javase/specs |
| JVM Specification | Especificación | docs.oracle.com/javase/specs |
| Java SE API Documentation | Documentación oficial | docs.oracle.com/javase |
| OpenJDK Project | Código abierto (GPL v2) | openjdk.org |
| Jakarta EE Specifications | Especificación (Eclipse) | jakarta.ee/specifications |
| Apache Maven Documentation | Documentación oficial | maven.apache.org (Apache 2.0) |
| Spring Framework Reference | Documentación oficial | docs.spring.io (Apache 2.0) |