Para instalar Apache Tomcat como servicio de windows es tan fácil como:
1 - D
escargar 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