Incluir un archivo servicio (SAR) en un EAR en JBoss

En algunos casos resulta conveniente agregar un servicio completo dentro de un EAR. Esto tiene sentido cuando el servicio es completamente parte de una aplicación en particular y no se espera que participe en el ámbito de otras. También es útil en situaciones en que necesitamos llamar a algunas clases de una aplicación particular desde el servicio, evitando problemas de clases no encontradas debido a que los servicios se cargan antes al inicio de JBoss, como se explica en el artículo Deployment de un Scheduler en JBossDeployment de un Scheduler en JBoss.

Para hacer esto, debemos realizar dos pasos:

  • El más obvio, debemos agregar el archivo SAR dentro del EAR. En caso de estar usando Eclipse con JBoss IDE, se debe modificar la Packaging Configuration y referenciar directamente el archivo SAR ya generado.
  • La parte menos obvia dice relación con agregar un descriptor que le indique a JBoss que al momento del deploy del EAR debe además deployar el SAR. En un EAR normalmente le decimos esto en el archivo META-INF/application.xml, donde por ejemplo, indicamos que hay uno o más JAR con los EJB, un WAR con la interfaz web, etc. Pero para agregar un SAR el esquema de este archivo no incluye un tag para un servicio. A diferencia de los otros casos, el servicio se agrega en un archivo separado llamado jboss-app.xml, y se ve así:
<?xml version="1.0"?>

<jboss-app>

  <module>
    <service>MiNuevoScheduler.sar</service>
  </module>

</jboss-app>

En este archivo, como puede apreciarse, indicamos que existe un módulo de tipo servicio contenido en el SAR “MiNuevoScheduler.sar”. Al ver esto JBoss sabrá que este SAR que viene en el EAR tiene que ser instalado como un servicio. En caso contrario simplemente lo ignorará.

La línea que viene comentada en el ejemplo (“loader-repository”) es una opción que permite que este SAR se cargue sobre un ámbito de clases distinto, evitando el choque de clases con el mismo nombre. Se debe recordar que JBoss siempre carga la primera versión de una clase que ha sido cargada cada vez que coinciden los nombres. Con esto nos aseguramos de tener un espacio propio.