CodeHaus Cargo - Ejecutando aplicaciones Jakarta EE sin descargar servidores
Una de las tantas dificultas que tiene un desarrollador de Jakarta EE es el configurar un servidor de - justamente - Jakarta EE. Aparte que existe varias como GlassFish, JBoss, Resin, Tomcat / TomEE, WebLogic, Wildfly (y de más), lo más complicado es:
- Descargar
- Configurar
Pues en este artículo vamos a conocer un plugin que ha reducido el dolor de cabeza. Se llama Code Haus Cargo.
En este ejemplo ejecutaremos una aplicación bastante sencilla, con un CRUD simple para RESTful (usaremos base de datos h2) y lo trataremos de ejecutar en Apache TomEE y en WebLogic.
Proyecto Base
Y un JPA:
La base de datos será agnóstica, tanto así que no la estaré configurando en el proyecto. Solo tengo esta configuración:
Cargo
Ahora bien, cuando uso un IDE, ya sea IntelliJ, NetBeans o VisualStudio Code he tenido problemas para ejecutar el proyecto en un servidor Jakarta EE. Los problemas son los siguientes
- Configurar el servidor en el mismo IDE
- Configurar la conexión de base de datos en el Servidor
- Ejecutar el servidor desde el IDE
Si me siguen desde hace un tiempo, sabrán que soy muy seguir de Payara... y su servidor no me funciona en los IDEs, ni menos en el (también bien usado IDE por mí) NetBeans. Así que estaba buscando una manera de cómo ejecutarlo de manera transparente. Pensé en Docker, pero aún debo configurar por cada uno de ellos.... hasta que conocí a Codehaus Cargo!.
Sin mucha vuelta, vamos al grano.
Cargo tiene muchas maneras de ejecutarse, pero vamos al más simple: un plugin de Maven.
Del mismo proyecto que hemos creado, vamos a agregar al
pom.xml
un perfil (para no modificar la funcionalidad normal del
proyecto)
Este es el extracto del perfil, con comentarios para explicar qué hace cada parte
<profile> <id>local-cargo</id> <build> <plugins> <plugin> <groupId>org.codehaus.cargo</groupId> <artifactId>cargo-maven3-plugin</artifactId> <version>1.10.19</version> <configuration> <containerId>tomee10x</containerId> <!-- el nombre del contenedor --> <container> <contextKey>${project.artifactId}</contextKey> <!-- el contexto de la aplicación --> <dependencies> <!-- las dependencias que se incluir en el servidor --> <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> </dependency> </dependencies> <log>${project.build.directory}/cargo.log</log> <!-- quiero ver un log --> <logLevel>DEBUG</logLevel> </container> <configuration> <datasources> <!-- configuro la conexión a la base de datos --> <datasource> <jndiName>jdbc/person</jndiName> <connectionType>javax.sql.Driver</connectionType> <driverClass>org.hsqldb.jdbc.JDBCDriver</driverClass> <url>jdbc:hsqldb:mem:persondb</url> <username>sa</username> <password>sa</password> </datasource> </datasources> <properties> <cargo.logging>high</cargo.logging> </properties> </configuration> </configuration> </plugin> </plugins> </build> </profile>
La configuración no es difícil de seguirle el rastro. Es fácil de entender
Lo que me sorprende de esta configuración es lo siguiente
- Solo le digo que se tratará de, en este caso, tomee10x (línea 68) y Cargo se encargará de bajar el contenedor adecuado, y en adelante, todas las configuraciones serán respecto a ese contenedor.
- No me debo preocupar dónde debo colocar la biblioteca del JDBC. Solo le digo que deba incluirlo (línea 72) y Cargo se encargará.
- Le digo que utilice un DataSource (línea 83) y Cargo, conociendo que se trata de Tomee (en este caso) se encargará de configurar todo para este proyecto
Ahora, probemos cómo funciona
Ejecución del proyecto
Como ahora está dentro de un perfil, necesitamos activar el proyecto, y
ejecutamos el goal cargo:run

Ejecutando...
Cuando ya aparezca este mensaje, es porque ya está corriendo el contenedor Java
¿Lo probamos?
Otro contenedor Java
Podemos cambiar a cualquier contenedor (servidor) Java que nos proporciona Cargo según esta lista: https://codehaus-cargo.github.io/cargo/Home.html
Si bien ya hay servidores descontinuados, al menos da soporte a algunos nuevos. Entre ellos están:
- Payara
- Apache Tomee
- Apache Tomcat
- Wildfly
- Open Liberty (con el nombre WebSphere Liberty)
Ahora bien ¿cómo cambiar de servidor? Pues solo cambiar el valor del tag
containerId
con alguno que está en la tabla de Cargo. Nada más.
Para que sea más simple nuestro trabajo, vamos a parametrizar. Ese valor lo pondremos como propiedad de Maven
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.release>21</maven.compiler.release> <junit.version>5.12.2</junit.version> <org.hsqldb.version>2.7.4</org.hsqldb.version> <containerId>tomee10x</containerId> </properties>
Ahora, lo ponemos en el plugin
<groupId>org.codehaus.cargo</groupId> <artifactId>cargo-maven3-plugin</artifactId> <version>1.10.19</version> <configuration> <containerId>${containerId}</containerId> <container>
Y ejecutamos
Como se puede ver, la cabecera que devuelve en la respuesta ya dice "Payara" a diferencia del anterior que decía "Apache TomEE"
¿Cuánto modifiqué en el proyecto?
¡NADA!
¿Cómo funciona?
Recursos
- Código base: https://github.com/apuntesdejava/jakarta-ee-cargo/tree/simple
- Código con Cargo: https://github.com/apuntesdejava/jakarta-ee-cargo/tree/cargo
Comentarios
Publicar un comentario
Si quieres hacer una pregunta más específica, hazla en los foros que tenemos habilitados en Google Groups
Ah! solo se permiten comentarios de usuarios registrados. Si tienes OpenID, bienvenido! Puedes obtener su OpenID, aquí: http://openid.net/