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ñoVersiónHito clave
1995JDK 1.0Sun Microsystems publica Java. Lema: "Write Once, Run Anywhere" (WORA)
1998J2SE 1.2Se introduce Collections Framework (java.util), Swing
2004J2SE 5.0Generics, anotaciones, autoboxing, enums, for-each, varargs
2006Java SE 6Scripting API (JSR 223), mejoras rendimiento. Sun libera OpenJDK
2011Java SE 7try-with-resources, diamond operator (<>), switch con String, NIO.2
2014Java SE 8 (LTS)Lambdas, Stream API, Optional, java.time, default methods en interfaces
2017Java SE 9Módulos (JPMS — Project Jigsaw), JShell (REPL)
2018Java SE 11 (LTS)var en lambdas, HTTP Client estándar, eliminación de Java EE del JDK
2021Java SE 17 (LTS)Sealed classes, pattern matching para instanceof, records
2023Java 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.
ComponenteQué esContieneQuién lo usa
JVMMáquina virtual que ejecuta bytecodeClass Loader, JIT compiler, Garbage Collector, áreas de memoriaInterno — el usuario no lo invoca directamente
JREEntorno de ejecuciónJVM + bibliotecas estándar (rt.jar)Usuario final que solo ejecuta .jar
JDKKit completo de desarrolloJRE + 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

HerramientaFunciónEjemplo de uso
javacCompilador: .java.class (bytecode)javac MiClase.java
javaLanzador de la JVMjava MiClase o java -jar app.jar
jarEmpaquetador de archivosjar cf app.jar *.class
javadocGenerador de documentación HTMLjavadoc -d docs src/*.java
jdbDepuradorjdb MiClase
jshellREPL interactivo (desde Java 9)jshell
jlinkCrea runtime personalizado (módulos)jlink --add-modules java.base --output myrt
keytoolGestión de certificados y keystoreskeytool -genkeypair -alias mikey

MODELO DE MEMORIA DE LA JVM

Fuente: JVM Specification §2.5 (docs.oracle.com/javase/specs) — documento público.
ÁreaCompartidaContenidoError asociado
HeapSí (todos los hilos)Objetos y arrays (instancias creadas con new)OutOfMemoryError
StackNo (uno por hilo)Frames de método: variables locales, operandos, puntero de retornoStackOverflowError
Method AreaMetadatos de clase, constantes, código de métodos. Incluye el String PoolOutOfMemoryError
PC RegisterNo (uno por hilo)Dirección de la instrucción actual
Native Method StackNoFrames de métodos nativos (JNI)StackOverflowError

GARBAGE COLLECTOR (GC)

ColectorTipoCaracterísticasActivación
Serial GCStop-the-world, un hiloSencillo, para apps pequeñas-XX:+UseSerialGC
Parallel GCStop-the-world, multi-hiloThroughput alto-XX:+UseParallelGC
G1 GCRegiones, concurrente parcialDefault desde Java 9. Divide heap en regiones de ~1-32 MB-XX:+UseG1GC
ZGCConcurrente, baja latenciaPausas < 1 ms. Desde Java 15 (production)-XX:+UseZGC
ShenandoahConcurrente, baja latenciaSimilar 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 OOPEn JavaMecanismo
EncapsulaciónOcultar estado internoModificadores de acceso + getters/setters
HerenciaReutilizar código de una clase padreextends (clase) / implements (interfaz)
PolimorfismoMisma interfaz, distinto comportamientoSobreescritura (@Override) y sobrecarga
AbstracciónDefinir contratos sin implementaciónabstract class / interface

HERENCIA EN JAVA

ConceptoMecanismoRegla clave
Herencia simpleclass Hijo extends PadreJava NO soporta herencia múltiple de clases
Implementación múltipleclass A implements I1, I2Sí se permiten múltiples interfaces
Clase raízjava.lang.ObjectToda clase hereda implícitamente de Object
Sobreescritura@OverrideMisma firma, no puede ser más restrictivo en acceso
SobrecargaMismo nombre, distinta firmaDiferente número o tipo de parámetros
supersuper.metodo()Llama al método de la clase padre
thisthis.campoReferencia a la instancia actual

MODIFICADORES DE ACCESO

ModificadorMisma claseMismo paqueteSubclase (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

ModificadorSobre claseSobre métodoSobre variable
staticSolo clases internasPertenece a la clase, no a instanciasVariable de clase compartida
finalNo se puede heredarNo se puede sobreescribirConstante (no reasignable)
abstractNo instanciableSin cuerpo, la subclase debe implementar
synchronizedSolo un hilo a la vez
volatileLectura/escritura directa a memoria principal
transientExcluida de serialización
nativeImplementado en código nativo (C/C++)
strictfpAritmética IEEE 754 estrictaAritmética IEEE 754 estricta

TIPOS DE DATOS PRIMITIVOS

Fuente: JLS §4.2 — Primitive Types and Values.
TipoBitsRangoWrapperValor por defecto
byte8-128 a 127Byte0
short16-32.768 a 32.767Short0
int32-2³¹ a 2³¹-1Integer0
long64-2⁶³ a 2⁶³-1Long0L
float32IEEE 754 simpleFloat0.0f
double64IEEE 754 dobleDouble0.0d
char160 a 65.535 (Unicode UTF-16)Character'\u0000'
boolean~1true / falseBooleanfalse
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.
InterfazOrdenDuplicadosImplementaciones principales
ListInserción (indexado)ArrayList (array dinámico), LinkedList (doblemente enlazada), Vector (sincronizado, legacy)
SetNo garantizadoNoHashSet (hash), LinkedHashSet (inserción), TreeSet (ordenado natural)
QueueFIFO (por defecto)LinkedList, PriorityQueue (por prioridad), ArrayDeque
DequeFIFO y LIFOArrayDeque (preferido como stack), LinkedList
MapNo garantizadoClaves únicasHashMap, LinkedHashMap (inserción), TreeMap (clave ordenada), Hashtable (legacy, sincronizado)
OperaciónArrayListLinkedListHashSetHashMapTreeMap
Acceso por índiceO(1)O(n)
Inserción al finalO(1) amort.O(1)
Inserción en medioO(n)O(1)*
BúsquedaO(n)O(n)O(1)O(1)O(log n)
OrdenadoNo (preserva inserción)NoNoNoSí (natural)
Pregunta clásica: HashMap permite una clave null y múltiples valores null. Hashtable no permite nulls. TreeMap no permite clave null.

COLECCIONES CONCURRENTES

ClaseReemplaza aMecanismo
ConcurrentHashMapHashtable / Collections.synchronizedMap()Bloqueo por segmentos (striped locking), lectura sin bloqueo
CopyOnWriteArrayListVector / Collections.synchronizedList()Copia el array en cada escritura; lectura sin bloqueo
BlockingQueueProductor-consumidor: put() bloquea si llena, take() si vacía
ConcurrentLinkedQueueCola no bloqueante, lock-free (CAS)

EXCEPCIONES

Fuente: JLS §11 — Exceptions. Jerarquía de java.lang.Throwable.
TipoClase baseCheckedEjemplosObligatorio capturar
CheckedException (excl. RuntimeException)IOException, SQLException, ClassNotFoundExceptionSí (try-catch o throws)
UncheckedRuntimeExceptionNoNullPointerException, ArrayIndexOutOfBoundsException, IllegalArgumentExceptionNo (pero recomendable)
ErrorErrorNoOutOfMemoryError, StackOverflowErrorNo (no recuperables)
Jerarquía
ThrowableError (JVM) + ExceptionRuntimeException (unchecked) + checked exceptions
Tip examen: try-with-resources (Java 7+) cierra automáticamente recursos que implementan AutoCloseable. El bloque finally siempre se ejecuta (excepto System.exit()).

GENÉRICOS (GENERICS)

ConceptoSintaxisEjemplo
Clase genéricaclass 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 TipoAcepta Tipo y subclases (lectura)
Wildcard lower? super TipoAcepta Tipo y superclases (escritura)
Type erasureLos 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 funcionalMétodoEntrada → SalidaUso típico
Predicate<T>test(T)T → booleanfilter()
Function<T,R>apply(T)T → Rmap()
Consumer<T>accept(T)T → voidforEach()
Supplier<T>get()() → TLazy creation
UnaryOperator<T>apply(T)T → TreplaceAll()
BinaryOperator<T>apply(T,T)(T,T) → Treduce()
Operación StreamTipoEjemplo
filter()Intermediastream.filter(x -> x > 5)
map()Intermediastream.map(String::toUpperCase)
flatMap()IntermediaAplana Stream de Streams
sorted()Intermedia (stateful)stream.sorted(Comparator.reverseOrder())
distinct()Intermedia (stateful)Elimina duplicados
collect()Terminalstream.collect(Collectors.toList())
reduce()Terminalstream.reduce(0, Integer::sum)
forEach()Terminalstream.forEach(System.out::println)
count()TerminalNú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.Thread API docs, java.util.concurrent (JSR 166), JMM (Java Memory Model — JLS §17).
Forma de crear hilosCódigoVentaja
Extender Threadclass MiHilo extends Thread { run()... }Simple pero impide herencia múltiple
Implementar Runnableclass 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 + Executorexecutor.submit(() -> { ... })Moderno, gestión de pool de hilos
MecanismoQué haceCuándo usar
synchronizedMonitor lock: solo un hilo ejecuta el bloque/métodoSecciones críticas simples
volatileVariable visible inmediatamente a todos los hilosFlags simples (no operaciones compuestas)
ReentrantLockLock explícito con tryLock, timeout, fairnessControl avanzado
AtomicInteger/LongOperaciones atómicas sin locks (CAS)Contadores, acumuladores
wait()/notify()Comunicación entre hilosProductor-consumidor clásico
ExecutorServicePool de hilos gestionadoPreferido sobre crear hilos manualmente
Estado del hiloDescripción
NEWCreado pero no iniciado
RUNNABLEEjecutándose o listo para ejecutarse
BLOCKEDEsperando adquirir un monitor lock
WAITINGEsperando indefinidamente (wait(), join())
TIMED_WAITINGEsperando con timeout (sleep(), wait(n))
TERMINATEDHilo finalizado

VIRTUAL THREADS (Java 21+)

AspectoPlatform ThreadVirtual Thread
Mapeo1:1 con hilo del SOM:N (multiplexado sobre carrier threads)
Coste~1 MB stack, costoso de crear~pocos KB, millones posibles
Creaciónnew Thread()Thread.ofVirtual().start(() -> ...)
Ideal paraCPU-bound, cálculo intensivoI/O-bound: HTTP, DB, ficheros
BloqueoBloquea hilo del SOSolo unmount del carrier; otro virtual thread ocupa su lugar

LOGGING EN JAVA

FrameworkTipoNiveles (de menos a más grave)
java.util.loggingEstándar JDKFINEST, FINER, FINE, CONFIG, INFO, WARNING, SEVERE
SLF4JFachada (facade)TRACE, DEBUG, INFO, WARN, ERROR
Log4j 2ImplementaciónTRACE, DEBUG, INFO, WARN, ERROR, FATAL
LogbackImplementació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

HerramientaFichero configFormatoCaracterísticas
Mavenpom.xmlXMLConvention over configuration. Ciclo de vida: validatecompiletestpackageverifyinstalldeploy
Gradlebuild.gradleGroovy/Kotlin DSLIncremental, caché de tareas, más rápido que Maven en builds grandes
Antbuild.xmlXMLLegacy. Tareas imperativos, sin convenciones
Concepto MavenDescripción
GAVgroupId:artifactId:version — identificador único de un artefacto
DependenciasDeclaradas en <dependencies>; se descargan del repositorio central
Scopecompile (default), test, provided, runtime, system
PluginsExtienden el ciclo de vida: maven-compiler-plugin, maven-surefire-plugin
RepositoriosLocal (~/.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.
AspectoJDBCJPA
NivelBajo nivel — SQL directoAlto nivel — ORM
Clase claveConnection, PreparedStatement, ResultSetEntityManager, @Entity, @Table
SQLEscrito manualmenteGenerado automáticamente (o JPQL)
MapeoManual: rs.getString("col")Automático: anotaciones @Column, @Id
ImplementacionesDrivers: MySQL Connector/J, PostgreSQL JDBC, ojdbcHibernate, EclipseLink, OpenJPA
Anotación JPAFunción
@EntityMarca clase como entidad JPA (= tabla)
@Table(name="...")Nombre de la tabla (si difiere del nombre de clase)
@IdClave primaria
@GeneratedValueGeneración automática de ID (IDENTITY, SEQUENCE, TABLE, AUTO)
@ColumnMapeo columna-campo
@OneToMany / @ManyToOneRelaciones entre entidades
@ManyToManyRelación N:M (tabla intermedia)
@NamedQueryConsulta 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 de javax.* a jakarta.* a partir de Jakarta EE 9 (2020).

EVOLUCIÓN

AñoNombreVersiónHito
1999J2EE1.2Servlets, JSP, EJB 1.1
2006Java EE5Anotaciones reemplazan XML, JPA 1.0, EJB 3.0 simplificado
2013Java EE7WebSocket, JSON-P, Batch, Concurrency Utilities
2017Java EE8Última versión Oracle. CDI 2.0, Servlet 4.0 (HTTP/2), JSON-B
2019Jakarta EE8Misma funcionalidad que Java EE 8, paquetes javax.*
2020Jakarta EE9Migración de namespace: javax.*jakarta.*
2022Jakarta EE10Core Profile para microservicios, CDI Lite
2024Jakarta EE11Java SE 17+ mínimo, Virtual Threads support

ARQUITECTURA DE CAPAS

CapaResponsabilidadTecnologíasContenedor
ClienteInterfaz de usuarioHTML/JS, Applets (obsoleto), SwingNavegador / JVM cliente
WebControl de peticiones HTTPServlets, JSP, JSF, JAX-RSServlet Container (Tomcat, Jetty)
NegocioLógica de negocioEJB, CDI beans, ManagedBeansEJB Container (WildFly, GlassFish)
DatosPersistenciaJPA, JDBC, JCAProveedor de persistencia

SERVLETS

Fuente: Jakarta Servlet 6.0 Specification (jakarta.ee). Componente fundamental de la capa web.
FaseMétodoCuándo
Cargainit(ServletConfig)Primera petición (o al arrancar si load-on-startup)
Servicioservice(request, response) → delega a doGet(), doPost()...Cada petición HTTP
Destruccióndestroy()Al parar el servidor o redesplegar
Concepto ServletDescripción
HttpServletRequestDatos de la petición: parámetros, headers, sesión, cookies
HttpServletResponseRespuesta: status code, headers, body (PrintWriter / OutputStream)
FilterIntercepta peticiones/respuestas (logging, auth, encoding). Cadena de filtros
ListenerEventos del contexto o sesión (ServletContextListener, HttpSessionListener)
web.xmlDescriptor de despliegue (deployment descriptor). Alternativa: anotaciones (@WebServlet)
Front ControllerPatrón: un servlet central despacha a controladores. Usado por Spring MVC (DispatcherServlet)

EJB (Enterprise JavaBeans)

Tipo EJBCiclo de vidaEstadoUso típico
@StatelessPool gestionado por contenedorSin estado entre llamadasServicios de negocio, operaciones sin estado
@StatefulLigado a un cliente (sesión)Mantiene estado conversacionalCarrito de compra, wizards multi-paso
@SingletonÚnica instancia por aplicaciónEstado compartidoCaché, configuración, init de app
@MessageDrivenActivado por mensajes JMSSin estadoProcesamiento 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ónFunción
@InjectInyección de dependencia (reemplaza new + lookups JNDI)
@NamedPermite referenciar el bean desde EL (Expression Language) en JSF
@RequestScopedBean vive una petición HTTP
@SessionScopedBean vive toda la sesión del usuario
@ApplicationScopedBean vive mientras dure la aplicación (singleton CDI)
@ProducesMétodo factory que crea instancias inyectables
@QualifierDesambigua cuando hay varias implementaciones de la misma interfaz

JAX-RS (RESTful Web Services)

AnotaciónFunciónEjemplo
@PathRuta base del recurso@Path("/usuarios")
@GETMétodo HTTP GETObtener recurso
@POSTMétodo HTTP POSTCrear recurso
@PUTMétodo HTTP PUTActualizar recurso completo
@DELETEMétodo HTTP DELETEEliminar recurso
@PathParamParámetro de la URL@Path("/{id}") getUser(@PathParam("id") long id)
@QueryParamParámetro de query string?page=2
@Produces / @ConsumesMedia type@Produces("application/json")

PRINCIPALES APIs JAKARTA EE

APIEspecificaciónFunción
ServletJakarta Servlet 6.0Procesamiento de peticiones HTTP
JPAJakarta Persistence 3.1ORM — mapeo objetos a tablas
EJBJakarta Enterprise Beans 4.0Componentes de negocio con servicios del contenedor
CDIJakarta CDI 4.0Inyección de dependencias y contextos
JAX-RSJakarta RESTful WS 3.1APIs REST declarativas
JSFJakarta Faces 4.0Framework MVC para vistas (component-based)
JMSJakarta Messaging 3.1Mensajería asíncrona (colas y topics)
JSON-PJakarta JSON Processing 2.1Parseo/generación JSON a bajo nivel
JSON-BJakarta JSON Binding 3.0Serialización/deserialización JSON ↔ objetos
Bean ValidationJakarta Validation 3.0Validación declarativa: @NotNull, @Size, @Email
JTAJakarta Transactions 2.0Transacciones distribuidas
JNDIJava Naming and Directory InterfaceLookup de recursos: DataSources, EJBs, JMS queues

SERVIDORES DE APLICACIONES

ServidorTipoCertificaciónProveedor
Apache TomcatServlet ContainerSolo Servlet + JSPApache Foundation (código abierto)
Eclipse JettyServlet ContainerServlet + WebSocketEclipse Foundation
WildFlyFull Application ServerJakarta EE completoRed Hat (código abierto, antes JBoss AS)
Eclipse GlassFishFull Application ServerImplementación de referencia Jakarta EEEclipse Foundation
IBM Open LibertyFull Application ServerJakarta EE completoIBM (código abierto)
Oracle WebLogicFull Application ServerJakarta EE completoOracle (comercial)
IBM WebSphereFull Application ServerJakarta EE completoIBM (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

ProfileContenidoUso
Full PlatformTodas las APIs Jakarta EEAplicaciones empresariales completas
Web ProfileServlet, JSF, CDI, JPA, EJB Lite, Bean Validation, JTAAplicaciones web sin JMS ni conectores
Core Profile (desde EE 10)CDI Lite, JAX-RS, JSON-P, JSON-BMicroservicios — 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óduloFunciónEquivalente Jakarta EE
Spring Core / IoCContenedor de inversión de control y DICDI
Spring MVCFramework web MVC (DispatcherServlet)JSF / JAX-RS
Spring BootAuto-configuración, servidor embebido, opinado
Spring Data JPARepositorios JPA simplificadosJPA
Spring SecurityAutenticación y autorizaciónJakarta Security
Spring CloudMicroservicios: config, discovery, circuit breakerMicroProfile

NOVEDADES CLAVE POR VERSIÓN (RESUMEN EXAMEN)

VersiónNovedades más preguntadas
Java 5Generics, for-each, enums, autoboxing, varargs, anotaciones
Java 7try-with-resources, diamond <>, switch String, NIO.2, multi-catch
Java 8Lambdas, Stream API, Optional, java.time, default methods, :: method references
Java 9Módulos (JPMS), JShell, List.of() / Map.of() (colecciones inmutables)
Java 11var en lambdas, String.isBlank(), HTTP Client, eliminación JEE del JDK
Java 14Records (preview), switch expressions, NullPointerException mejorado
Java 17Sealed classes (JEP 409), pattern matching instanceof. Records estables desde Java 16 (JEP 395)
Java 21Virtual 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.
FuenteTipoReferencia
Java Language Specification (JLS)Especificacióndocs.oracle.com/javase/specs
JVM SpecificationEspecificacióndocs.oracle.com/javase/specs
Java SE API DocumentationDocumentación oficialdocs.oracle.com/javase
OpenJDK ProjectCódigo abierto (GPL v2)openjdk.org
Jakarta EE SpecificationsEspecificación (Eclipse)jakarta.ee/specifications
Apache Maven DocumentationDocumentación oficialmaven.apache.org (Apache 2.0)
Spring Framework ReferenceDocumentación oficialdocs.spring.io (Apache 2.0)

¿Quieres practicar este tema con tests?

MIMIR tiene más de 5.000 preguntas verificadas, simulacros con penalización real y chat IA que resuelve tus dudas sobre este tema.

Abrir MIMIR gratis →