sábado, 17 de enero de 2026

RESTEasy: un REST de manera fácil

RESTEasy es, en pocas palabras, una implementación de JAX-RS; un framework para crear servicios web RESTful.

Permite crear servicios REST usando anotaciones como @Path, @GET, @POST, etc., sobre clases e interfaces Java. También permite crear clientes RESTful, pues provee frameworks para realizar esa tarea.

Ayuda al desarrolllador web a crear APIs que se comunican a través de HTTP, facilitando la creación de microservicios y servicios web ligeros en el ecosistema Java.

Se puede integrar con Quarkus y Wildfly.

Para mayor información puedes consultar este sitio: https://docs.resteasy.dev/7.0/userguide/

Empezando con RESTEasy

Existen dos formas recomendadas:

  • La manera clásica: con Jakarta EE 10 y Wildfly. 
  • La moderna y recomendada: con Quarkus y RESTEasy Reactive.

Nosotros elegiremos Quarkus con RESTEasy Reactive (Quarkus REST) para crear un sencillo servicio.

Tenemos dos opciones para crear el proyecto.

Con Quarkus CLI:

$ quarkus create app mx.inforhomex:hola-quarkus-rest --extension=rest

Si no contamos con la herramienta, la podemos instalar con estos comandos:

Linux:

$ curl -Ls https://sh.jbang.dev | bash -s - trust add https://repo1.maven.org/maven2/io/quarkus/quarkus-cli/
$ curl -Ls https://sh.jbang.dev | bash -s - app install --fresh --force quarkus@quarkusio

Usando SDKMAN!:

$ sdk install quarkus

Windows:

$ iex "& { $(iwr https://ps.jbang.dev) } trust add https://repo1.maven.org/maven2/io/quarkus/quarkus-cli/"
$ iex "& { $(iwr https://ps.jbang.dev) } app install --fresh --force quarkus@quarkusio"

La otra alternativa para crear el proyecto es con Maven:

$ mvn io.quarkus.platform:quarkus-maven-plugin:3.15.1:create -DprojectGroupId=mx.inforhomex -DprojectArtifactId=hola-quarkus-rest -Dextensions=rest

Una vez creado el proyecto nos ubicaremos en el directorio principal.

$ cd hola-quarkus-rest

Abrimos y editamos la clase ``GreetingResource.java`` para que luzca de esta forma:

package mx.inforhomex;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import java.util.HashMap;

@Path("/saludar")
public class GreetingResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public HashMap<String, Object> saludar() {
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("message","Hola, mundo desde Quarkus REST");
        map.put("active",true);
        map.put("id",1202029L);
        return map;
    }
}

Ejecutamos con Quarkus:

$ quarkus dev

O con Maven:

$ ./mvnw quarkus:dev

Abrimos el navegador en la ruta: http://localhost:8080/saludar

Si todo va bien, veremos esta salida:

{active=true, id=1202029, message=Hola, mundo desde Quarkus REST}

¡Hemos creado nuestro primer proyecto con RESTEasy y Quarkus!

En próximas entregas hablaremos de Quarkus, un fuerte contendiente de Spring Boot.

Enlaces:

https://resteasy.dev/
https://docs.resteasy.dev
https://codemonkeyjunior.blogspot.com/2026/01/un-vistazo-jakartaee.html
https://es.quarkus.io/


LangChain4j

LangChain4j es una librería para Java que unifica y simplifica la integración de modelos de lenguaje (LLM) y stores vectoriales en tus aplicaciones. Ofrece APIs unificadas para múltiples proveedores (OpenAI, Vertex AI, etc.) y stores (Pinecone, Milvus, etc.), además de un toolbox con patrones comunes como plantillas de prompts, memoria conversacional, RAG, agentes y function calling

Se usa en escenarios empresariales para construir asistentes con RAG, moderación y reglas de entrada/salida, manteniendo control sobre datos e infraestructura.

En pocas palabras, es una opción similar a Spring AI del que hablaremos en otra ocasión.

Sus principales características son:

  • API unificada que permite interactuar con diversos proveedores. 
  • Integración con frameworks como Sprinc Boot, Quarkus y Helidon. 
  • Memoria de conversación. 
  • Soporte RAG. 
  • Function Calling.

¿Qué se puede hacer con esta herramienta?

  • Extracción y tratamiento de texto. 
  • Chatbots. 
  • Agentes de IA. 
  • Etc.

Empezando con LangChain4j

OpenAI es una empresa de investigación y despliegue de IA y es la opción más directa y estable para probar LangChain4j. Iniciemos con un proyecto Java.

Requisitos:

  • Tener el JDK instalado (última versión). 
  • Tener Maven instalado (última versión). 
  • Tener una cuenta OpenAI (https://openai.com)

1. Creamos el proyecto con Maven y nos ubicamos en el directorio generado:

$ mvn archetype:generate -DgroupId=com.inforhomex -DartifactId=demo-langchain4j -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
$ cd demo-langchain4j

2. Agregamos las dependencias necesarias en el archivo ``pom.xml``

<dependencies>
  <!-- Núcleo LangChain4j -->
  <dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j</artifactId>
    <version>0.31.0</version>
  </dependency>

  <!-- Cliente OpenAI -->
  <dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai</artifactId>
    <version>0.31.0</version>
  </dependency>
</dependencies>

3. Ahora editaremos la clase App.java

package com.inforhomex;


import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;

public class App {
    public static void main(String[] args) {
        ChatLanguageModel model = OpenAiChatModel.builder()
            .apiKey(System.getenv("OPENAI_API_KEY"))
            .modelName("gpt-4o-mini")
            .build();

        String respuesta = model.generate("Explica qué es LangChain4j en 2 frases.");
        System.out.println(respuesta);
    }
}

4. Obtener la API KEY OPENAI. Vamos a este sitio: https://platform.openai.com/account/api-keys

Una vez logeados debemos ir a la sección de API keys y crear una nueva. Deberá crearte una cadena encriptada de aproximandamente 165 caracteres. Guardala en un bloc de notas o cualquier otro editor.

5. Crear la variable de entorno.

Linux:

$ export OPENAI_API_KEY="tu_api_key_aquí"

Windows (Powershell):

$ setx OPENAI_API_KEY "tu_api_key_aquí"

5. Construimos nuestro proyecto Java con Maven:

$ mvn clean install -X

O con este otro comando:

$ mvn clean package

6. Hacer ejecutable nuestro proyecto, para ello modificamos el archivo ``pom.xml``:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.inforhomex</groupId>
  <artifactId>demo-langchain4j</artifactId>
  <version>1.0</version>

  <name>demo-langchain4j</name>
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>21</maven.compiler.source>
    <maven.compiler.target>21</maven.compiler.target>
  </properties>

  <dependencies>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>2.0.12</version>
</dependency>


    <!-- Cliente OpenAI -->
    <dependency>
      <groupId>dev.langchain4j</groupId>
      <artifactId>langchain4j-open-ai</artifactId>
      <version>0.31.0</version>
    </dependency>

    <!-- Núcleo LangChain4j -->
    <dependency>
      <groupId>dev.langchain4j</groupId>
      <artifactId>langchain4j</artifactId>
      <version>0.31.0</version>
    </dependency>
  </dependencies>

  <repositories>
    <repository>
      <id>central</id>
      <url>https://repo.maven.apache.org/maven2</url>
    </repository>
  </repositories>

  <build>
    <plugins>
      <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <mainClass>com.inforhomex.App</mainClass>
            </configuration>
        </plugin>

        <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>3.3.0</version>
      <configuration>
        <archive>
          <manifest>
            <mainClass>com.inforhomex.App</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>

    </plugins>
  </build>
</project>

7. Ejecutamos el proyecto:

$ mvn exec:java -Dexec.mainClass=com.inforhomex.App

Si tines problemas con tu OPEN AI KEY puedes escribir:

$ mvn compile exec:java -Dexec.mainClass=com.inforhomex.App -DOPENAI_API_KEY=AQUI_TU_OPENAI_KEY

Si todo va bien, deberá mostrarte una respuesta.

Conclusión: Hemos visto como hacer una consulta usando LangChain4j desde una aplicación Java.

Continuarmos con este tema en próximas entregas.

Enlaces:

https://github.com/langchain4j/langchain4j
https://www.linkedin.com/pulse/langchain4j-el-poder-de-la-ia-conversacional-para-java-fabian-aguero-vmv2f/
https://medium.com/mitb-for-all/langchain4j-building-generative-ai-applications-in-java-670ec3d6167d
https://adictosaltrabajo.com/2024/03/05/langchain4j-potenciando-tus-aplicaciones-java-con-inteligencia-artificial-ia-y-modelos-de-lenguaje-de-gran-escala-llm-primeros-pasos/
https://www.reddit.com/r/java/comments/14ff6ie/seekeng_feedback_langchain4j_a_library_for_easy/?tl=es-419
https://www.baeldung.com/maven-java-main-method

domingo, 11 de enero de 2026

Claude Code: un nuevo enfoque de la programación por pares

Claude Code es una herramienta de inteligencia artificial creada por Anthropic que funciona directamente en la terminal. Sirve para acelerar el desarrollo de software al generar, analizar, editar y corregir código, además de gestionar flujos de trabajo como pruebas y Git sin salir del entorno local.

En pocas palabras,  un asistente de codificación agéntico que vive en tu terminal.

Sirve para:

  • Generar fragmentos de código a partir de ideas. 
  • Leer y analizar proyectos completos. 
  • Editar y corregir errores automáticamente. 
  • Ejecutar pruebas y generar pull requests
  • Manejar flujos de trabajo de Git y búsqueda semántica en tu base de código.

En pocas palabras, Claude Code convierte tu terminal en un entorno de desarrollo inteligente, ayudando a programadores a trabajar más rápido y con menos fricción.

Claude Code y otras herramientas similares

Claude Code se diferencia de ChatGPT, DeepSeek y Microsoft Copilot principalmente en su enfoque: está diseñado para vivir en la terminal y actuar como un par programador que entiende, edita y gestiona proyectos completos de código, mientras que los otros asistentes tienen un alcance más general o están integrados en aplicaciones específicas

Diferencias principales:

  • Claude Code vs ChatGPT: Claude Code está especializado en desarrollo dentro de la terminal, mientras que ChatGPT es más generalista y se usa para múltiples tareas (escribir, aprender, programar, etc.). 
  • Claude Code vs DeepSeek: DeepSeek busca ofrecer potencia similar a GPT-4 a menor costo, pero no está diseñado específicamente para integrarse en flujos de desarrollo como Claude Code. 
  • Claude Code vs Microsoft Copilot: Copilot se integra en aplicaciones de Microsoft y GitHub, mientras que Claude Code vive en la terminal y gestiona proyectos completos con búsqueda semántica y edición directa. 
  • Claude Code vs Claude (IA general): Claude general es un modelo conversacional seguro y con gran capacidad de contexto; Claude Code es su versión enfocada en programación y terminal.

Tabla comparativa de asistentes de programación

Herramienta Enfoque Entorno principal Integración con código/proyectos Git y flujos CI/CD Búsqueda semántica en repos Testing desde el asistente Contexto largo Ecosistema y extensiones Casos ideales
Claude Code (Anthropic) Asistente dev en terminal CLI / Terminal Analiza, edita y corrige proyectos completos Opera comandos Git y genera PRs Sí (en el repositorio local) Sí (ejecuta y guía pruebas) Alto (modelos Claude) Integración con herramientas dev; menos enfoque en Office Desarrollo ágil en terminal, refactoring guiado
ChatGPT (OpenAI) Asistente generalista Web / API / Extensiones Genera y explica código; no gestiona repos locales por sí mismo Limitado (requiere herramientas externas) Parcial (via plugins/extensiones) Orientado a guía, no a ejecución directa Alto (dependiendo del plan/modelo) Amplio ecosistema de plugins y terceros Ideación, documentación, aprendizaje y prototipado
DeepSeek IA de alto rendimiento y costo eficiente Web / API Genera/analiza código; integración depende del usuario Limitado (vía scripts/SDK del usuario) No nativo No nativo Variable según modelo SDKs y comunidad creciente Precio/rendimiento para tareas de código y análisis
Microsoft Copilot (incl. GitHub Copilot) Compleción y asistencia en IDE + productividad Microsoft VS Code / IDEs / Office / Windows Completa y sugiere código en tiempo real Fuerte con GitHub (PRs, repos, acciones) Parcial (dependiendo de extensiones) Limitado (más enfoque en IDE que en ejecución) Medio–alto (según variante) Integración profunda en ecosistema Microsoft Trabajo en IDE, repos GitHub, Office y flujos empresariales
Claude (conversacional general) IA conversacional segura y con gran contexto Web / API Genera y revisa código; no gestiona terminal directamente Limitado (requiere herramientas externas) Parcial (vía integraciones) No nativo Muy alto (modelos más recientes) Integraciones via API y herramientas de terceros Análisis de documentos extensos, diseño y revisión técnica

Como mencionamos en entregas pasadas el Vibe Coding o "codificación por sensaciones" ha cambiado como el desarrollador trabajará en el futuro. No sabemos a ciencia cierta si seremos simples observadores o incluso reemplazados.

Enlaces:

https://claude.com/product/claude-code
https://claude.ai
https://alquimistadecodigo.blogspot.com/2015/04/pair-programming.html
https://www.elladodelmal.com/2025/03/que-es-el-vibe-coding.html
https://www.enriquedans.com/2025/12/el-espejismo-del-vibe-coding-cuando-la-relajacion-progresiva-convierte-al-programador-en-espectador.html
https://www.enriquedans.com/2025/11/cuando-el-software-se-escribe-a-ojo-por-que-el-vibe-coding-seduce-y-por-que-conviene-desconfiar.html

sábado, 10 de enero de 2026

Moonbit en un vistazo

MoonBit es una cadena de herramientas de lenguaje de programación nativo de IA para computación en la nube y edge. Se compila a WebAssembly, JavaScript y C.

Es muy similar a lenguajes como Python y sobre todo a Go

Ambos lenguajes (MoonBit y Go) son similares en:

  • Típicos estáticos con inferencia de tipos.
  • Lenguajes compilados con compilación rápida.
  • Seguridad en memoria, aunque con mecanismos ligeramente diferentes.
  • Orientado a la computación moderna con excelentes herramientas.

Aunque ya vimos algo sobre este lenguaje, hoy veremos cómo instarlo y algunos ejemplos de uso.

Instalando MoonBit

Instalando en Linux:

$ curl -fsSL https://cli.moonbitlang.com/install/unix.sh | bash

Instalando en Windows:

$ Set-ExecutionPolicy RemoteSigned -Scope CurrentUser; irm https://cli.moonbitlang.com/install/powershell.ps1 | iex

Verificamos la instalación:

$ moon version

Podemos ver la ayuda:

$ moon help

Para quienes usan Visual Studio Code, se puede descargar un plugin del lenguaje:

https://marketplace.visualstudio.com/items?itemName=moonbit.moonbit-lang

Programando en MoonBit

Ejemplo 1. El clásico "Hola, mundo".

holamundo.mbt

fn main {
  println("Hola, mundo.")
}

Ejecución:

$ moon run holamundo.mbt

Salida:

Hola, mundo.

Ejemplo 2. Tipos de datos en MoonBit. Aquí veremos los tipos de datos. 

tipos.mbt

fn main{
  let int : Int = 42
  let uint : UInt = 42
  let int64 : Int64 = 42
  let double : Double = 42
  let float : Float = 42
  let bigint : BigInt = 42
  let cadena : String = "FERROCARRIL"
  let c : Char = 'A'
  let verdadero : Bool = true
  println("\t Tipos de datos en MoonBit.")
  println(int)
  println(uint)
  println(int64)
  println(double)
  println(float)
  println(bigint)
  println(cadena)
  println(c)
  println(verdadero)
}

Ejecución:

$ moon run tipos.mbt

Salida:

         Tipos de datos en MoonBit.
42
42
42
42
42
42
FERROCARRIL
A
true

Ejemplo 3. Programa que nos muestre ejemplo de sentencias condicionales.

condicional.mbt

fn main{
  println("\t Condicionales en MoonBit.")
  let mut bandera: Bool = 23 > 22
  
  if bandera{
    println("Fue verdadero.")
    bandera = false
  }

  if bandera{
    println("Esto no se vera en pantalla.")
  }else{
    println("Esto si se vera en pantalla.")
  }

  let resultado = if "A" == "A"{
    "Esto fue verdadero."
  }else{
    "Esto fue falso."
  }
  println(resultado)
  println(fibonacci(5))
}
// Aqui usamos algo similar a switch
fn fibonacci(n : Int) -> Int {
  match n {
    0 => 0
    1 | 2 => 1
    _ => fibonacci(n - 1) + fibonacci(n - 2)
  }
}

Ejecución:

$ moon run condicional.mbt

Salida:

         Condicionales en MoonBit.
Fue verdadero.
Esto si se vera en pantalla.
Esto fue verdadero.
5

Ejemplo 4. Sumar los primeros 100 números pares. Con esto veremos un ejemplo de sentencias iterativas.

iterativas.mbt

fn main{

println("\t Sumar los primeros 100 números pares en MoonBit.")
let suma = for i = 1, acc = 0; i <= 100; i = i + 1 {
  if i % 2 == 0 {
    continue i + 1, acc + i
  }
} else {
  acc
}

   println(suma)

}

Ejecución:

$ moon run iterativas.mbt

Salida:

         Sumar los primeros 100 números pares en MoonBit.
2550

Ejemplo 5. Programa que tenga funciones para suma, resta, multiplicación y división de números enteros.

funciones.mbt

fn main{
  println("\t Funciones en MoonBit.")
  let a: Int = 3
  let b: Int = 2
  println(suma(a, b))
  println(resta(a, b))
  println(producto(a, b))
  println(division(a, b))
}

fn suma(x: Int, y: Int)-> Int {
  x + y
}

fn resta(x: Int, y: Int)-> Int {
  x - y
}

fn producto(x: Int, y: Int)-> Int {
  x * y
}

fn division(x: Int, y: Int)-> Int {
  x / y
}

Ejecución:

$ moon run tipos.mbt

Salida:

         Funciones en MoonBit.
5
1
6
1

Ejemplo 6. Un programa que use estructuras.

estructuras.mbt

struct Persona {
  nombre : String
  apellidos: String
  edad : Int
}

struct Punto{
  x:Int
  y:Int
}

fn main{
  println("\t Estructuras en MoonBit.")
  let thomas = Persona::{ nombre: "Thomas", apellidos: "Muller", edad: 30 }
  let p: Punto = {x: 23, y:43}

  println(thomas.nombre)
  println(thomas.apellidos)
  println(thomas.edad)

  println(" --------------- ")
  println(p.x)
  println(p.y)
}

Ejecución:

$ moon run estructuras.mbt

Salida:

        Estructuras en MoonBit.
Thomas
Muller
30
 ---------------
23
43

Conclusiones:

Hemos instalado MoonBit en nuestro sistema.

Hemos creado algunos programas para conocer lo básico del lenguaje.

En próximas entregas continuaremos con este tema.

Enlaces:

https://www.moonbitlang.com/
https://codemonkeyjunior.blogspot.com/2025/11/moonbit-un-lenguaje-orientado-la-ia.html

jueves, 1 de enero de 2026

Un vistazo a JakartaEE

Los que vienen programando en Java algún tiempo sabrán que trabajar con este lenguaje tiene sus pros y contras. No todo ha sido fácil, pero tampoco algo imposible.

Crear aplicaciones web con Servlets y JSP con sus configuraciones tediosas le complicaban la vida a más de uno. Ni se diga con los odiosos EJB y el uso de servidores como JBoss, Glassfish, etc.

Después vino Spring Framework con su Spring Boot que facilitó la vida a los desarrolladores web. Pues está herramienta se encargaba de lo complicado y dejaba al programador enfocarse en una sola cosa: su código.

Jakarta EE es la evolución directa de Java EE, el Java empresarial que muchos sufrían en antaño. La documentación oficial nos dice:

  • Es conjunto de especificaciones que se utiliza para crear productos y frameworks Java para aplicaciones empresariales a gran escala. 
  • Impulsa sistemas como bancos, sitios de comercio electrónico y plataformas empresariales. 
  • Se basa en Java SE con API adicionales para desarrollo web, acceso a bases de datos, mensajería y seguridad.

Características principales:

  • Tecnologías web: Servlets, JSP, JSF.
  • Lógica de negocio: EJB (Enterprise JavaBeans).
  • Persistencia de datos: JPA Mensajería: JMS Seguridad y transacciones.

Jakarta EE se ejecuta en servidores de aplicaciones como WildFly, GlassFish y Payara, que gestionan la configuración, la escalabilidad y el ciclo de vida.

Jakarta EE Get Started

Para los que vienen de Spring Boot este sitio se les hará familiar:

https://start.jakarta.ee/

Pues es similar al sitio https://start.spring.io/, el cual nos ayuda a crear un proyecto listo para usar y que nos evita las odiosas y tediosas configuraciones.

La documentación oficial nos dice:

"Jakarta EE Get Started crea rápidamente una aplicación Jakarta EE lista para usar, eliminando las complicaciones habituales de configuración. En lugar de empezar con una carpeta vacía, obtienes un proyecto completo y funcional, listo para construir, como si empezaras con un set de LEGO preconstruido que puedes personalizar al instante. Incluye la configuración correcta de Maven, estructuras de directorios estándar y código de ejemplo que demuestra los conceptos clave de Jakarta EE".

En pocas palabras, Jakarta EE aprendió lo que no hizo Java EE.

Al entrar al sitio podemos ver un formulario similar al de Spring Boot Initializer:

Comencemos con un proyecto sencillo.

Descargamos el archivo ZIP y lo descomprimimos en algún directorio:

$ cd jakartaee-hello-world

Veamos el contenido del proyecto:

src\main\java\org\eclipse\jakarta\hello\Hello.java
src\main\java\org\eclipse\jakarta\hello\HelloApplication.java
src\main\java\org\eclipse\jakarta\hello\HelloWorldResource.java

Hello.java

package org.eclipse.jakarta.hello;

public class Hello {

    private String name;

    public Hello(String name) {
        this.name = name;
    }

    public String getHello(){
        return name;
    }
}

La cual es una clase o un bean.

HelloApplication.java

package org.eclipse.jakarta.hello;

import jakarta.ws.rs.core.Application;
import jakarta.ws.rs.ApplicationPath;

@ApplicationPath("rest")
public class HelloApplication extends Application {
    
}

Similar a la aplicación tipo Spring Boot.

HelloWorldResource.java

package org.eclipse.jakarta.hello;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.MediaType;

@Path("hello")
public class HelloWorldResource {

    @GET
    @Produces({ MediaType.APPLICATION_JSON })
    public Hello hello(@QueryParam("name") String name) {
        if ((name == null) || name.trim().isEmpty()) {
            name = "world";
        }

        return new Hello(name);
    }
}

La cual es una clase similar a un Controller en Spring Boot.

En teoría, es una aplicación funcional. Comprobemos esto.

Compilamos el proyecto:

$ mvn clean install

Si todo va bien, nuestra aplicación estará compilada y se habrá creado el WAR en la carpeta generada llamada target.

Ahora será necesario descargar e instalar Glassfish:

https://glassfish.org/download

Una vez descargado y descomprimido en algún directorio en específico, debemos crear la variable de entorno para poder ejecutarlo:

C:\glassfish7\bin

Ahora iniciaremos el servidor Glassfish:

$ asadmin start-domain

Abriremos el navegador en la ruta: http://localhost:4848

Entraremos al administrador de Glassfish. Vamos a Application/Deploy. Seleccionamos nuestro WAR y damos ok. Ya podemos ejecutar la aplicación.

Abrimos el navegador en la ruta: http://localhost:8080/jakartaee-hello-world/rest/hello?name=Thomas_Muller

Salida:

¡Hemos creado nuestra primera aplicación con Jakarta EE!

Detenemos el servidor Glassfish:

$ asadmin stop-domain

Actualización:

Si no quieres instalar Glassfish, puedes ejecutar este comando:

$ mvnw clean package wildfly:run

Deberás descargar la última versión de Wildfly:

https://www.wildfly.org/downloads/

Descomprimir el ZIP y colocarlo en algún directorio (C:\wildfly).

Además de editar el pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.eclipse</groupId>
    <artifactId>jakartaee-hello-world</artifactId>
    <version>0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>jakartaee-hello-world</name>
    <description>
        Simple Jakarta EE 11 application running on WildFly.
    </description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.report.sourceEncoding>UTF-8</project.report.sourceEncoding>
        <maven.compiler.release>21</maven.compiler.release>
        <jakartaee-api.version>11.0.0-RC1</jakartaee-api.version>
        <compiler-plugin.version>3.13.0</compiler-plugin.version>
        <war-plugin.version>3.4.0</war-plugin.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>jakarta.platform</groupId>
            <artifactId>jakarta.jakartaee-core-api</artifactId>
            <version>${jakartaee-api.version}</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>jakartaee-hello-world</finalName>
        <plugins>
            
            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
                <version>4.2.0.Final</version>
                <configuration>
                    <jbossHome>C:\wildfly</jbossHome>
                    <startupTimeout>180</startupTimeout>
                </configuration>
            </plugin>

            
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${compiler-plugin.version}</version>
            </plugin>

           
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>${war-plugin.version}</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project> 

Ya podrás desplegarlo sin la necesidad de iniciar Glassfish.

Feliz año 2026

Este es el post número 400 del blog.😉

Enlaces:

https://jakarta.ee/
https://www.linkedin.com/pulse/java-explained-servlets-jsp-jakarta-ee-rohit-bhosale-r2gzf/?trackingId=XgJjdE8PQombg7SZoMmx9Q%3D%3D
https://jakarta.ee/learn/starter-guides/a-comprehensive-beginners-guide-to-the-get-started/

RESTEasy: un REST de manera fácil

RESTEasy es, en pocas palabras, una implementación de JAX-RS; un framework para crear servicios web RESTful. Permite crear servicios...

Etiquetas

Archivo del blog