Deadlock Eclipse(R) tiene un gran conjunto de herramientas como el depurador. Un depurador permite a un usuario controlar un programa mientras se está ejecutando. El uso de un depurador para entender cómo funciona un programa, es una buena manera de encontrar posibles errores. El depurador se puede conectar de forma remota a una JVM que este ejecutándose en el Wrapper y se puede ver paso a paso lo que está sucediendo. En el siguiente ejemplo, podrá ver que configurar el depurador es muy fácil.

Solución

Requisito: Descargar el Java Service Wrapper

En este ejemplo, usaremos la última versión del Wrapper: 3.5.26 Por favor descargar el Wrapper para su plataforma y guardarla en el disco duro. Por ejemplo en: /home/tanuki/wrapper-3.5.26/

Descargar el código fuente de Java

El código fuente del Java Service Wrapper esta disponible vía SourceForge. Descarga el código fuente aquí descargar para la versión que acaba de descargar en el paso anterior. En este ejemplo, usaremos el código fuente de la versión 3.5.26.

Descargar los archivos en su máquina por ejemplo en el folder /home/tanuki/wrapper_3.5.26_src

NOTA

El código fuente de Java es el mismo para todas las ediciones del Wrapper (Comunidad, Estándar y Profesional).

Archivos de Eclipse

Crear los siguientes dos archivos (usados por Eclipse) en el folder /home/tanuki/wrapper_3.5.26_src/src/java

.classpath
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="src" path="."/>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
</classpath>
.project
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
	<name>wrapper-code</name>
	<comment></comment>
	<projects>
	</projects>
	<buildSpec>
		<buildCommand>
			<name>org.eclipse.jdt.core.javabuilder</name>
			<arguments>
			</arguments>
		</buildCommand>
	</buildSpec>
	<natures>
		<nature>org.eclipse.jdt.core.javanature</nature>
	</natures>
</projectDescription>

Eclipse

Importar el código fuente de Java en Eclipse:

NOTA

Este procedimiento asume que Eclipse se ha descargado en Español. Para instrucciones en Ingles visitar How can I remote debug my application with Eclipse?

  • Iniciar Eclipse
  • Clic en Archivo
  • Continuar en Importar
  • Seleccionar Proyectos Existentes
  • Continuar en Next
  • Seleccionar el folder /home/tanuki/wrapper_3.5.26_src/src/java
  • Clic en Terminar

Una vez que el folder se haya importado, verá un error en Eclipse. Para arreglar esto siga los siguientes pasos:

  • Remover la extensión .in en el archivo org.tanukisoftware.wrapper.WrapperInfo.java.in
Abrir el archivo y aplicar los siguientes cambios:
  • Cambiar @version.root@ a 3.5.26
  • Cambiar @build.date@ a 20131212
  • Cambiar @build.time@ a 1200

My Application

En Eclipse, crearemos una aplicación "MyApplication" que será iniciada por el Java Service Wrapper. El folder para este proyecto es /home/tanuki/workspace/MyApplication.

Crear una clase my.app.test.HelloWorld.

HelloWorld.java
package my.app.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.tanukisoftware.wrapper.WrapperManager;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Enter your name: ");

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String name = "";

        try {
            name = br.readLine();
        } catch (IOException ioe) {
            System.out.println("Could not read your name!");
            System.exit(1);
        }

        System.out.println("Hello, " + name + "!");
		
        String version = WrapperManager.getVersion();
        System.out.println("Wrapper Version: " + version);
    }
}

Eclipse mostrará algunos errores sobre el WrapperManager. Para solucionar esto abrir Propiedades en MyApplication y agregar wrapper-code en la vía de construcción Java.

Vincular el Java Service Wrapper con MyApplication

Abrir el archivo /home/tanuki/wrapper-3.5.26/conf/wrapper.conf y configurar las siguientes propiedades:

wrapper.conf
# information to run MyApplication
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp

# set the path to your application
wrapper.java.classpath.3=/home/tanuki/workspace/MyApplication/bin
wrapper.app.parameter.1=my.app.test.HelloWorld

# set the Wrapper in debug mode
wrapper.java.additional.1=-Xdebug
wrapper.java.additional.2=-Xrunjdwp:transport=dt_socket,address=8001,server=y,suspend=y

NOTA

Puerto 8001 será utilizado más tarde por Eclipse.

En este ejemplo, estamos usando el Método de Integración 1 para integrar MyApplication con el Java Service Wrapper.

Ejecutar el Java Service Wrapper

Ejecutar el Java Service Wrapper usando el siguiente comando:

Aplicación de Ejemplo TestWrapper
bin/testwrapper console console

Notará que el proceso parece estar congelado.

Esperando por un Depurador
Listening for transport dt_socket at address: 8001
In realidad, el Wrapper está a la espera a que un depurador sea adjuntado.

Ejecutar el Depurador

En Eclipse, siga los siguientes pasos para crear un depurador remoto:

  • Seleccionar en el menu Depuración -> Configurar Depuración... -> Aplicación Remota Java
  • Crear Nueva configuración de Lanzamiento.
  • Asignar un nombre (ejemplo "RemoteWrapper").
  • Seleccionar el proyecto wrapper-code.
  • Configurar Host a localhost.
  • Configurar a Puerto 8001 (mismo valor configurado en wrapper.conf).
  • Clic en la pestaña Fuente.
  • Clic en Agregar, seleccionar Java project y escoger los dos MyApplication y wrapper-code.
  • Finalmente haz clic en Depurar

Apartir de este punto, el depurador de Eclipse esta vinculado a MyApplication y el Wrapper! Si observa el la terminal, verá que MyApplication se está ejecutando. En el código fuente, puede agregar Puntos de interrupción y depurar la aplicación. De esta manera podrá ver qué línea es ejecutada.