Translate

Mostrando entradas con la etiqueta tomcat. Mostrar todas las entradas
Mostrando entradas con la etiqueta tomcat. Mostrar todas las entradas

martes, 1 de julio de 2014

Remote Debug in tomcat 6 and 7

Título: Debug remoto sobre servidor de aplicaciones Tomcat 6 y 7.

What happends when we can´t install and application in a local tomcat in order to debug some issue o bug?

The answer is easy, remote debug y the key. It allows you to debug the code in the same way like if your web application was installed in your machine.

Note: You have to have installed in your local machine the same code that is in the remote machine to do properly remote debug.

Configuration:

1 - Remote server´s configuration: The remote server have to be setted with params to determine a port (8000 for example) where the server will listen to a remote debug connection.

When you run tomcat you have to pass to virtual machine this params:

-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n

The easy way to do it is to edit the file [tomcat_installation]\bin\setenv.bat and add this lines

set DEBUG=-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
set JAVA_OPTS=%JAVA_OPTS% %DEBUG%              

2 - Local configuration (eclipse):

You have to create a Remote Java Application in Debug Configurations:



With the next options, setting a socket with the remote server host and port 8000 .



don´t forget to select the Project where the source code is located.

Happy Debug!!!


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














jueves, 8 de noviembre de 2012

Tomcat: Arrancar Tomcat con parámetros

Una vez visto como se arranca el tomcat desde linea de comandos en la misma ventana de comandos de windows en unos de los artículos anteriores.

Ahora vamos ver como añadir parámetros desde la línes de comandos de tomcat, para hacerlo utilizamos lo que tenemos añadir es la variable de entorno JAVA_OPTS y podemos añadir todos los parámetros que necesitemos.

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

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

catalina run
 

miércoles, 10 de octubre de 2012

Tomcat: Arrancar tomcat en la misma ventana de comandos en Windows


Start tomcat in the same command window

Cuando intentamos configurar rápidamente un tomcat 6 o 7 el primer problema que con encuentro es que al lazar el comando startup o catalina start todas las trazas e información me aparecen en una ventana de comandos nueva.





Eso no estaría nada mal si esa ventana no se cerrara al terminar la ejecución o cuando ocurre un problema en el arranque inicial del tomcat.

Para que todo arranque dentro de la misma ventana de comandos debemos de arrancar tomcat con la siguiente línea de comandos:

catalina run


viernes, 2 de marzo de 2012

Error Tomcat 7 al iniciar: VerifyError: Cannot inherit from final class

Estaba configurando unos de nuestros proyectos con MAVEN y estaba poniendo en le archivo POM todos los JARS que tenía que en la carpeta WEB-INF\lib.

Una vez que termino el proceso arranco el servidor para ver si todo está en orden y me encuentro que aparece el siguiente error que es tan poco descriptivo:

Información: Starting Servlet Engine: Apache Tomcat/7.0.14
java.lang.VerifyError: Cannot inherit from final class
 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:1969)
 at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1932)
 at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1826)
 at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1785)
 at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1771)
 at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1254)
 at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:881)
 at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:316)
 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:5103)
 at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
 at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
 at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:774)
 at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
 at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
 at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:291)
 at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
 at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
 at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
 at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727)
 at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:620)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:601)
 at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:431)


Después de googlear un poco veo que el problema puede residir en los JAR que estaba poniendo en el proyecto y voy quitando uno a uno hasta que el entorno arranca correctamente y detecto cual era el problema.

El problema era que he puesto una versión más vieja de un JAR, concretamente spring-data-commons-core-1.1.0.RELEASE, y tendría que ser spring-data-commons-core-1.2.0.RELEASE

Este jar antiguo en combinación con otros y la configuración de Spring ha hecho que Tomcat no sea capaz de arrancar.

Así que si te ocurre este error yo revisaría las librerías jar que tiene tu proyecto.