jump to navigation

Depurar un servlet de tomcat remotamente febrero 7, 2007

Posted by superpiwi in Java.
add a comment

Si desde Eclipse queremos depurar un servlet de tomcat que se encuentra en una maquina remota tenemos que realizar los siguientes pasos:

En la maquina remota, Tenemos que añadir las siguientes opciones cuando la JVM de Tomcat arranca:

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

Para ello editamos el fichero catalina.sh o en su defecto arrancamos tomcat con la opcion «jpda start».

pstigpr1(manager): /usr/local/tomcat/bin > ./catalina.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JAVA_HOME: /usr/local/jdk1.5.0_10
Usage: catalina.sh ( commands ... )
commands:
debug Start Catalina in a debugger
debug -security Debug Catalina with a security manager
jpda start Start Catalina under JPDA debugger
run Start Catalina in the current window
run -security Start in the current window with security manager
start Start Catalina in a separate window
start -security Start in a separate window with security manager
stop Stop Catalina
stop -force Stop Catalina (followed by kill -KILL)
version What version of tomcat are you running?
pstigpr1(manager): /usr/local/tomcat/bin > ./catalina.sh jpda start
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JAVA_HOME: /usr/local/jdk1.5.0_10
pstigpr1(manager): /usr/local/tomcat/bin > ./catalina.sh jpda start

Ahora desde el IDE de eclipse vamos a Run > Debug > Remote Java Application

En ella indicamos la maquina a la que queremos conectar remotamente y el nombre del proyecto.

debug.jpg

Para que la depuracion funcione tenemos que tener el codigo del proyecto desplegado remotamente en nuestra perspectiva de Recursos.

Ahora solo basta con pulsar «Debug» y abrir con el navegador la URL de la aplicacion remota.

Cuando lleguemos al punto de ruptura establecido se parara la ejecucion del programa y podremos depurarlo desde la perspectiva de depuracion.

JNI en Linux febrero 7, 2007

Posted by superpiwi in Java.
17 comments

Vamos a ver un ejemplo de como escribir una libreria en C que pueda ser llamada desde nuestras clases en JAVA. Para ello emplearemos JNI (Java Native Interface). Para compilar la libreria empleamos CDT que es un subproyecto de Eclipse para tener un IDE para C/C++. Asi que sin salir del entorno podemos estar desarrollando código Java y escribiendo nuestras librerias en C/C++. Empezamos.

Escribimos la clase java:

//File: Hello.java
public class Hello
{
public native void sayHello();
static {
System.out.println("java.library.path:"+System.getProperty("java.library.path"));
// Si quisieramos cargar la libreria buscando en el java.library.path
//System.loadLibrary("hello");
// Para forzar la carga de la libreria
System.load("/home/jose/workspace/Hello/hello.so");
}
public static void main(String[] args) {
Hello h = new Hello();
h.sayHello ();
}
}

Si intentamos ejecutar la clase java obtenemos lo siguiente:

jose@soledad:~/workspace/Hello$ ls
Hello.class Hello.h Hello.java
jose@soledad:~/workspace/Hello$ java Hello
java.library.path:/usr/lib/jvm/java-1.5.0-sun-1.5.0.08/jre/lib/i386/client:/usr/lib/jvm/java-1.5.0-sun-1.5.0.08/jre/lib/i386:/usr/lib/jvm/java-1.5.0-sun-1.5.0.08/jre/../lib/i386:/home/jose/workspace/Hello
cargando /home/jose/workspace/Hello/hello.so
Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: /home/jose/workspace/Hello/hello.so
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1650)
at java.lang.Runtime.load0(Runtime.java:769)
at java.lang.System.load(System.java:968)
at Hello.<clinit>(Hello.java:9)
jose@soledad:~/workspace/Hello$

Normal, porque intenta cargar la libreria de enlace dinamico y no existe. Vamos a crearla.

Para ello, ahora generamos de manera automatica la cabecera del fichero C de la libreria empleando la utilidad javah:
javah Hello

se genera un fichero Hello.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hello */
#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Hello
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Hello_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif

Ahora abrimos Eclipse para crear un nuevo Proyecto C mediante CDT:

File > New > Standard make C project

copiamos el fichero Hello.h y creamos el fichero Hello.c

//File: Hello.c
#include <jni.h>
#include "Hello.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_Hello_sayHello
(JNIEnv *env, jobject obj)
{
printf("Hello world!\n");
return;
}

jni01.png

Creamos tambien el makefile:

# All Target
all:
-@echo 'Generando libreria de enlace dinamico'
gcc -shared -I"/usr/lib/jvm/java-1.5.0-sun/include" -I"/usr/lib/jvm/java-1.5.0-sun/include/linux" -o hello.so Hello.c
# clean Target
clean:
-@echo 'Eliminando libreria de enlace dinamico hello.so'
-rm hello.so

jni02.jpg

En propiedades del proyecto añadimos los includes de las librerias de JNI (estas cuelgan del directorio donde hayamos instalado el JDK). En el ejemplo:

/usr/lib/jvm/java-1.5.0-sun/include
/usr/lib/jvm/java-1.5.0-sun/include/linux

jni03.jpg

Compilamos la libreria de enlace dinamico con la opcion de menu Project > Build project
Se genera el fichero hello.so que copiamos al directorio donde esta la clase java. Ejecutamos y ya está.


jose@soledad:~/workspace/JAVAJNI$ ls
Hello.c Hello.h hello.so LEEME.txt makefile
jose@soledad:~/workspace/JAVAJNI$ make clean
Eliminando libreria de enlace dinamico hello.so
rm hello.so
jose@soledad:~/workspace/JAVAJNI$ make
Generando libreria de enlace dinamico
gcc -shared -I"/usr/lib/jvm/java-1.5.0-sun/include" -I"/usr/lib/jvm/java-1.5.0-sun/include/linux" -o hello.so Hello.c
jose@soledad:~/workspace/JAVAJNI$ cp hello.so ../Hello
jose@soledad:~/workspace/JAVAJNI$ cd ../Hello
jose@soledad:~/workspace/Hello$ ls
Hello.class Hello.h Hello.java hello.so
jose@soledad:~/workspace/Hello$ java Hello
java.library.path:/usr/lib/jvm/java-1.5.0-sun-1.5.0.08/jre/lib/i386/client:/usr/lib/jvm/java-1.5.0-sun-1.5.0.08/jre/lib/i386:/usr/lib/jvm/java-1.5.0-sun-1.5.0.08/jre/../lib/i386:/home/jose/workspace/Hello
cargando /home/jose/workspace/Hello/hello.so
Hello world!
jose@soledad:~/workspace/Hello$