Empezar
De cero a un servidor respondiendo, en cuatro órdenes. No hace falta nada más que git, Maven y un JDK 21.
Instalación
LuxCore no está publicado en Maven Central todavía. Se instala compilándolo desde el repositorio, que deja los artefactos en tu repositorio local de Maven.
Requisitos: git, Maven y un JDK 21 o superior. Nada
más — LuxCore no tiene dependencias externas.
Después, en tu pom.xml, toma solo lo que uses:
<dependency>
<groupId>lux</groupId>
<artifactId>lux-core</artifactId> <!-- arrastra lux-http -->
<version>0.2.0</version>
</dependency>
<!-- opcionales -->
<dependency><groupId>lux</groupId><artifactId>lux-view</artifactId><version>0.2.0</version></dependency>
<dependency><groupId>lux</groupId><artifactId>lux-data</artifactId><version>0.2.0</version></dependency>
<!-- el driver JDBC lo pone tu aplicación -->
<dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.7.3</version></dependency>
java/ejemplo es un gestor de tareas completo —vistas, formularios, H2 y
API REST— con 36 pruebas de punta a punta. Es el mejor sitio por donde empezar a leer.
En cinco minutos
Un controlador es una clase corriente. Lo que devuelve decide el formato: un objeto se
serializa a JSON, un String sale como texto plano, null es un
204. Sin anotación de por medio.
import lux.core.*; @Route("/api/tareas") public class TareaController { @Inject Tareas tareas; @Get public Object listar(@Query(value = "pagina", orElse = "1") int pagina) { return tareas.findPage(pagina, 20); } @Get("/{id}") public Object ver(@Path("id") long id) { return tareas.findById(id); } @Post public Object crear(@Body @Valid Tarea tarea) { return Result.created(tareas.insert(tarea)); } } public static void main(String[] args) { Lux.run(8080, TareaController.class); }
Eso es todo. Lux.run registra las rutas, levanta el servidor e imprime el
puerto y el tiempo de arranque. No hay web.xml, ni contenedor, ni despliegue.
Con todo declarado
Server servidor = Lux.app()
.port(8080)
.loadConfig()
.views(Templates.fromClasspath("plantillas"))
.fallback(StaticFiles.fromClasspath("estaticos", "/estaticos"))
.service(new Catalogo())
.authenticator(ctx -> sesiones.verificar(ctx.header("Authorization")))
.use(Cors.allowing("https://app.pe"))
.use(Csrf.enabled().exempt("/api/"))
.use(RateLimit.perMinute(300))
.controllers(TareaController.class, AdminController.class)
.routes(r -> r.get("/salud", ctx -> "ok"))
.start();
servidor.await(); // bloquea hasta que se apague