domingo, 3 de agosto de 2014

Framework Atlas de la Comunidad de Madrid en una Raspberry Pi con Tomcat y MySql

Después de mis primeros pasos con la Raspberry Pi y algunos experimientos esta semana, he decidido hacer una prueba de concepto, tratando de ejecutar una aplicación realizada con el Framework Atlas de la Comunidad de Madrid (en el que como sabéis llevo años involucrado) en un servidor Tomcat 7 contra una base de datos MySql, ambos instalados en la Raspberry.

Instalación de las Herramientas
Para ello, y tras comprobar que la JDK1.7 de Oracle ya viene incluída en Rapsbian, lo primero que he tenido que hacer es instalar el acceso remoto por SSH, de manera que a partir de entonces todo el trabajo lo he realizado desde mi PC, conectándome por SSH o por Escritorio Remoto a la Raspberry cuando ha sido necesario.
Lo siguiente ha sido instalar el servidor Tomcat 7. Instalar Tomcat ha sido fácil, basta con descargar el fichero apache-tomcat-7.0.55.tar.gz y descomprimirlo en el directorio donde quieras ejecutar tomcat (en mi caso en "/home/pi/java/tomcat/apache-tomcat-7.0.55").
Para poder ejecutar las aplicaciones Atlas en el servidor Tomcat también he tenido que tocar un poco la instalación por defecto de Tomcat, he eliminado la versión de la librería de Expression Language que viene en "/home/pi/java/tomcat/apache-tomcat-7.0.55/lib" y he añadido a ese directorio las siguientes librerías adicionales:
el-api-2.2.jar
el-impl-2.2.jar
jstl-1.2.jar
Después he instalado MySql en la Raspberry, según se indica en esta página. Una vez instalado, he tenido que conectarme y crear una base de datos de ejemplo llamada "atlas", y un usuario con el mismo nombre para poder acceder a ella. He utilizado las siguientes sentencias:
mysql -u root -p
Enter password:
mysql> CREATE DB atlas
mysql> USE atlas
mysql> CREATE USER 'atlas'@'localhost' IDENTIFIED BY 'atlas';
mysql> GRANT ALL PRIVILEGES ON atlas.* TO 'atlas'@'localhost'
mysql> FLUSH PRIVILEGES;
mysql> quit
Como ya tenía configurado en mi PC con Windows el filesystem compartido con la Raspberry, he decidido por agilidad realizar la aplicación de pruebas en el PC, y una vez generado el war copiarlo a la Raspberry para desplegarlo en Tomcat.

Entorno de Desarrollo y Arquetipo Web
Una vez descargado e instalado el DVD para el desarrollo de aplicaciones Atlas, he creado un Arquetipo Web básico para tratar de hacerlo correr en la Raspberry.
Para crear las tablas en la base de datos para el ejemplo que viene configurado en el Arquetipo Web, he tenido que modificar ligeramente el script de creación de objetos de base de datos que viene en la ruta "src/test/resources/schema_arquetipo_oracle.sql", he creado un fichero llamado "schema_arquetipo_mysql.sql" en el que he cambiado el tipo de datos Number de Oracle por el Int de MySql, y he eliminado la creación de las secuencias (no las necesitaba para mi prueba básica).

Modificaciones sobre el Arquetipo Web
Lo primero que he tenido que modificar sobre el Arquetipo Web recién generado ha sido el fichero "web/src/main/resources/environment.properties" para configurar la conexión contra la base de datos MySql:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/atlas
jdbc.username=atlas
jdbc.password=atlas
hibernate.dialect=org.hibernate.dialect.MySQLDialect
También he configurado en ese fichero la ruta donde se generan los archivos de log:
monitor.FILE.directorioCliente=/home/pi/java/tomcat/apache-tomcat-7.0.55/logs
Además de configurar la conexión, he tenido que añadir la siguiente dependencia de Maven al fichero "web/pom.xml" para incluir en el war el driver Jdbc de MySql:
También he tenido que modificar el fichero "src/main/webapp/META-INF/context.xml" para configurar la conexión con la base de datos en Tomcat, dejando el siguiente contenido:
Por último y antes de generar el war he tenido que editar el fichero "web/src/main/resources/conf/applicationContext-security-hostPolitica.xml" para añadirle la política a utilizar cuando se acceda a la aplicación a través de la IP de la Raspberry:


Modificaciones sobre el "war" y arranque
Realizadas todas estas modificaciones, he generado el war para el entorno local utilizando "maven clean install" sin ningún perfil. En ese momento he intentado desplegar tal cuál el war en el Tomcat de la Raspberry (copiándolo al subdirectorio "webapps"), pero ha surgido un problema con la librería "aspectj", ya que Atlas 1.2.7 está preparado para correr sobre JDK1.6, y no sobre 1.7. Para arreglar el problema he tenido que abrir el war y eliminar del directorio WEB-INF/lib las dos librerías de aspectj:
       aspectjrt-1.6.0
       aspectjweaver-1.6.0
Y en su lugar he puestos las del mismo nombre pero que corresponden a la versión 1.7.0.
Hecho esto el war ya estaba listo, lo he copiado al directorio "webapps" de la instalación de Tomcat y tras arrancar el servidor de aplicaciones (lo que ha durado 5 minutos)... VOILA!
Han sido varias horas hasta que he tenido la aplicación funcionando pero ha valido la pena. Aunque el rendimiento de la Raspberry con la aplicación deja bastante que desear, he conseguido el objetivo de la prueba de concepto, y por el camino he aprendido mucho sobre el funcionamiento de mi nuevo juguete ;-)