Translate

martes, 30 de julio de 2013

Eclipse: Refrescar un proyecto desde ANT

Yo realizo muchos scripts en ant, desde lo encargados de instalar, empaquetar y desplegar los proyectos hasta los que se encargan de inter-conectar proyectos del entorno de desarrollo (eclpise en este caso) como puede ser copia de archivos a otros proyectos y refresco de los mismos.

El refresco de un proyecto siempre se necesario siempre que se copian archivos desde otra ubicación, por ejemplo nosotros estamos utilizando proyectos Flex que tiene módulos, entonces estos módulos cada vez que se compilan quiero que se copien en el proyecto principal para su ejecución. Una vez copiado el archivo con el script de Ant lo que es necesario es refrescar el proyecto para que este se entere de que tiene archivos nuevos.

Esta funcionalidad puede hacer se directamente con un script de ant (ej: build.xml) que contenga la siguiente instrucción:

<eclipse.refreshLocal resource="project_name/folder_name" depth="infinite" />

Donde resource es la ruta relativa desde donde está nuestro archivo ant al proyecto que quieres refrescar.

Ejemplo: Script que se encarga de copiar todos los SWF situados en bin-debug del proyecto actual a la carpeta ../modules del proyecto AntuanMainProject.

Una vez copiado realizo el refresco del proyecto para que se materialice la modificación.

<?xml version="1.0" encoding="UTF-8"?>
   <project name="ForumModule" basedir="." default="copySWF" xmlns:artifact="antlib:org.apache.maven.artifact.ant">
   
      <target name ="copySWF" description="Copy SWF Module to Projects">             
       <copy todir="../../AntuanMainProject/bin-debug/modules" overwrite="true"><fileset dir="../bin-debug/"><include name="**/*.swf"/></fileset></copy>                     
       
       <eclipse.refreshLocal resource="../../AntuanMainProject/" depth="infinite"></eclipse.refreshLocal>
      </target>
            
</project>



lunes, 1 de julio de 2013

Instalar Tomcat como servicio de Windows 7

Para instalar Apache Tomcat como servicio de windows es tan fácil como:

1 - Descargar la última versión de Apache Tomcat (Yo prefiero en zip nada de instaladores).
2 - Descomprimir/Instalar el archivo descargado.
3 - Abrir una consola (cmd.exe) de commandos con permisos de administrador e ir al directorio de instalación del Tomcat.


5 - Creamos las siguientes variables de entorno con la rutas de instalación de nuestro Tomcat y de la máquina virtual de Java.

Nota: Damos por supuesto que Java está instalado en el siguiente directorio: C:\Program Files\Java\jdk1.7.0_09


CATALINA_HOME:  "C:\apache-tomcat-7.0.33-src-A"
JAVA_HOME:        "C:\Program Files\Java\jdk1.7.0_09"

6 - Entrar en el directorio bin y ejecutar el comando: service install Tomcat7



Tomcat 7 es el nombre que le daremos al servicio y es importante porque es el que nos servirá para arrancarlo.

Podemos eliminarlo con:

service remove Tomcat7

7 - Comprobar que el servicio se ha instalado correctamente entrando en las herramientas administrativas servicios



Y ya podemos arrancarlo y pararlo desde los servicios o desde linea de comando con las instrucciones

net start Tomcat7
net stop Tomcat7


Arrancar el servicio de tomcat desde linea de comando nos permitirá entre otras cosa arrancarlo fácilmente desde un script de ant.

Problemas conocidos:

1 - Problemas con la instalación del servicio:



Failed installing 'Tomcat7' service

Solución:
Este problema se produce principalmente porque no tenemos permisos desde la consola para instalar servicios, debemos de asegurarnos que tenemos permisos de administrador.


2 - Problema la arrancar el servicio:

Al arrancar el servicio desde la ventana de Herramientas del sistema - Servicios recibimos el siguiente mensaje:



O desde la consola de comando:

Error específico del servicio: 0.




Si vemos la consola de tomcat que está en el directorio /logs concretamente en el archivo comons-daemon2013-07-01.log veremos el siguiente error:

[2013-07-01 13:33:25] [info]  Starting service...
[2013-07-01 13:33:25] [error] %1 no es una aplicación Win32 válida.
[2013-07-01 13:33:25] [error] Failed creating java C:\Program Files\Java\jdk1.7.0_09\jre\bin\server\jvm.dll
[2013-07-01 13:33:25] [error] %1 no es una aplicación Win32 válida.
[2013-07-01 13:33:25] [error] ServiceStart returned 1
[2013-07-01 13:33:25] [error] %1 no es una aplicación Win32 válida.
[2013-07-01 13:33:25] [info]  Run service finished.
[2013-07-01 13:33:25] [info]  Commons Daemon procrun finished


Solución1: El problema se soluciona editando el script service.bat que se encaga de la instalación del servicio que está en el directorio /bin. Hacemos una copia de seguridad por si acaso del archivo y lo abrimos y buscamos todas las apariciones de "server\jvm.dll" y la cambiamos por "client\jvm.dll". 

Guardamos y reinstalamos el servicio de nuevo y veremos como arranca perfectamente.

Solución2:  Vamos al directorio bin de la instalación de nuestro tomcat y ejecutamos el archivo tomcat7w.exe que nos permite retocar el servicio que hemos creado a través del script.



Y cambiamos la ruta para que utilice el client\jvm.dll



3 - Problema con la versión de java con la que se arranca el servicio

Al arrancar el servicio y desplegar alguna de las aplicaciones puede que nos de el siguiente error:

ADVERTENCIA: Unable to load class [xxx.xxx.xxx.xxx.MainDashboardController] to check against the @HandlesTypes annotation of one or more ServletContentInitializers.

java.lang.UnsupportedClassVersionError: com/xxxx/xxxx/xxx/MainDashboardController: Unsupported major.minor version 51.0 (no puedo cargar clase com.gniux.dashboard.mvc.MainDashboardController)

 at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2822)

 at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1148)

 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1643)

 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)

 at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:1956)

 at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1919)


Este problema se produce porque al crearse el servicio se ha creado utilizando una JRE de una versión más baja que la que ha compilado las clases de la aplicación.

Solución:
En mi caso yo tengo compilada mi aplicación con una JDK1.70_02 y para comprobar como se ha creado el servicio vamos al directorio bin de la instalación de nuestro tomcat y ejecutamos el archivo tomcat7w.exe que nos permite retocar el servicio que hemos creado a través del script.




Como vemos en la imagen el tomcat se está arrancando con un JRE6 lo modificamos poniendo la jvm.dll correcta de nuestra jdk en mi caso .....\Java\jdk1.7.0_02\jre\bin\client\jvm.dll

Simplemente cambiándolo arrancará sin problemas de versiones.


4 - Problemas de Memoria al arrancar el servicio

Al desplegar una aplicación lo más normal es que tengamos el siguiente problema de memoria y necesitemos retocar los parámetros memoria del servicio.

Información: Despliegue del archivo MyWeb.war de la aplicación web
java.lang.OutOfMemoryError: PermGen space
 at java.lang.ClassLoader.defineClass1(Native Method)
 at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
 at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
 at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2818)
 at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1148)
 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1643)
 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
 at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:1956)
 at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1919)
 at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1806)
 at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1765)
 at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1751)
 at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1255)
 at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:882)
 at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:317)
 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
 at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
 at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5081)
 at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:812)
 at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:787)
 at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:607)
 at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:932)
 at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:723)
 at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:470)
 at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1322)
 at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
 at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
 at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:379)
 at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:324)
 at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1041)
Exception in thread "Thread-1" java.lang.OutOfMemoryError: PermGen space
 at java.util.WeakHashMap$Values.iterator(WeakHashMap.java:897)
 at org.apache.juli.ClassLoaderLogManager.shutdown(ClassLoaderLogManager.java:324)
 at org.apache.juli.ClassLoaderLogManager$Cleaner.run(ClassLoaderLogManager.java:54)


Si vemos la guía de Apache tomcat de como instalat tomcat como servicio de Windows, vemos que en la creación del servicio se pueden definir los parámetros y variables del entorno en que se ejecutará el servicio.

Nota Importante: Es importante saber que al arrancar tomcat desde los servicios las variables de entorno no sirven para nada, todo tiene que estar configurado dentro de el servicio.

Solución: Vamos al directorio bin de la instalación de nuestro tomcat y ejecutamos el archivo tomcat7w.exe que nos permite retocar el servicio que hemos creado a través del script.



y vemos que por defecto ya tenemos unos parámetros de memoria añadidos Initial Memory Pool y Maximum Memory Pool,

Para arrancar un par de aplicaciones desde linea de commandos en tomcat yo pongo estos parámetros en el script de arrranque:

set CATALINA_HOME=C:\apache-tomcat-7.0.33-src-A

set JAVA_HOME=D:\antuan\Java\jdk1.7.0_02

set JAVA_OPTS=-Xms800m -Xmx800m -XX:MaxPermSize=256m 

Eso valores de Xms y Xmx se corresponden con Initial Memory Pool y Maximum Memory Pool y podemos modificarlos directamente sin problemas pero que pasa con MaxPermSize.

Para definir este valor devemos ponerlo dentro de las JavaOptions

-XX:MaxPermSize=256m



Aquí debes ajustar tus parámetros de memoria dependiendo de tu aplicación/es y arrancará correctamente.


Referencias:
Tomcat Error – Prunsrv.C Failed Creating Java (Jvm.Dll)
Windows-service-HowTo
Tomcat Service On Windows