2009-03-26 34 views
44

Sé cómo puedo depurar una máquina virtual Java remota con Eclipse, pero ¿cómo puedo hacerlo con un programa Java Web Start? Tengo un problema que solo ocurre en Java Web Start. Debe estar relacionado con la seguridad.¿Cómo puedo depurar aplicaciones en Java Web Start (JNLP)?

Necesito una solución que funcione con una máquina virtual Java actual, como 1.6.0_12.

Respuesta

22

Es lo mismo que con cualquier otro proceso de Java que desee depurar de forma remota: debe configurar algunos argumentos para la VM (-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=12345 ) y luego conectarse al puerto determinado. En Java webstart 6.0, esto se puede hacer con la opción -J, en versiones anteriores a través de la variable de entorno JAVAWS_VM_ARGS. Ver detalles here.

+0

Solo una nota: usando Ubuntu 10.04 y 12.04 y webstart 6.0, solo funcionó después de configurar el parámetro ** server = y **. De lo contrario, recibí el error 'ERROR: JDWP Transport dt_socket no se pudo inicializar, TRANSPORT_INIT (510)', incluso si el puerto no estaba en uso. –

1

¿Ha intentado imprimir un registro de depuración? Eso es algo útil tener en cualquier caso, y podría ayudar en este caso.

Si desea una depuración real, consulte p. Ej. aquí: How can I debug under WebStart?

+0

Eso es realmente genial para tener control directo sobre todos los aspectos de la ejecución de la JVM ... Y también puedes buscar todo lo que WS launcher agrega desde su pantalla inicial al ejecutarlo ... –

21

Encienda el JWS VM manualmente. De esta manera puede proporcionar los parámetros de inicio para abrir el puerto de depuración. Aquí está una description, que es la siguiente:

set JAVAWS_TRACE_NATIVE=1 
set JAVAWS_VM_ARGS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8989,server=y,suspend=n" 
javaws http://server:port/descriptor.jnlp 
+1

+1 para una respuesta increíble. Sin embargo, esto no me permitirá editarlo para corregir un error tipográfico en la respuesta. No debe haber espacio antes de la "dirección = 8989". – fool4jesus

+0

@mkoeller en javaws http: // servidor: puerto/descriptor.jnlp qué número de puerto debo dar – Rekha

+5

Solo una nota, en Windows (Probado en XP) cuando configura 'JAVAWS_VM_ARGS' debe omitir las DOUBLE QUOTES' establecer JAVAWS_VM_ARGS = -Xdebug -Xnoagent -Djava.compiler = NONE -Xrunjdwp: transport = dt_socket, address = 8989, server = y, suspend = n' –

9

También puede proporcionar el parámetro de depuración en el ejecutable javaws usando la opción -J

Ejemplo:

javaws.exe -J-Xdebug -J-Xnoagent -J-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 http://server:port/descriptor.jnlp 
1

depurar un Web Inicie la aplicación en Linux, cree un script de shell ~/bin/javaws-debug.sh con la invocación javaws en modo de depuración como se describe arriba:

~/bin/javaws-debug.sh:

#!/bin/sh 
export JAVAWS_TRACE_NATIVE=1 
export JAVAWS_VM_ARGS="-Xdebug -Xnoagent -Djava.compiler=NONE 
    -Xrunjdwp:transport=dt_socket,address=8989,server=y,suspend=n" 
javaws "[email protected]" 

Luego, en su navegador, elija esa secuencia de comandos como la aplicación para invocar en archivos jnlp.

Por ejemplo, en Firefox, vaya a Editar → Preferencias → Aplicaciones, Tipo de contenido: Java Web Start, y elija "Usar otro" en Acción y elija el script del diálogo "Seleccionar aplicación auxiliar". En Chrome, debe modificar la configuración del sistema Linux. En KDE, vaya a Configuración del sistema → Asociaciones de archivos, Tipos conocidos: aplicación: x-java-jnlp-file, agregue una nueva aplicación, elija ~/bin/javaws-debug.sh desde "Elija aplicación para application/x-java -jnlp-file "diálogo.

Una vez que se ha configurado su navegador, aplicación Java Web Start empezará a usar su envoltura, lo que permitirá depurador para conectar en el puerto 8989.

12

En cuanto a las nuevas versiones de Java (Java 8u20 + y Java 7u70 +) que he experimentado que parámetros como -Xrunjdwp no se pueden pasar directamente ni usar JAVAWS_VM_ARGS. Mensaje Rejecting attempt to specify insecure property: -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 comenzó a aparecer en la salida de la consola.

La única solución que funcionó para mí fue pasar esos argumentos a la variable de sistema JAVA_TOOL_OPTIONS.

+1

Gracias por escribir esto, lo resolvió para mí. Necesario para eliminar las opciones de depuración de JAVAWS_VM_ARGS y moverlas a JAVA_TOOL_OPTIONS cuando se pasa de 1.7.0_10 a 1.7.0_75 –

+0

Esto también me funcionó, tengo varias jds en mi máquina, así que nunca sé exactamente qué se iniciarán: - | – bakoyaro

+2

Intenté esto pero algún tipo de comprobación de seguridad debe haber evitado que mis javaws se inicien (con JAVA_TOOL_OPTIONS no se iniciará, sin esto comenzaría). –

1

Con Java 8 y Windows 10, abra el símbolo del sistema (cmd.exe) y escriba lo siguiente:

set JAVAWS_TRACE_NATIVE=1 
set JAVA_TOOL_OPTIONS=-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 
javaws java-app.jnlp 
2

Usted tendrá que hacer lo siguiente:

  1. habilitar los registros de Java y rastreo en el Panel de control de Java> Avanzado. Java Control Panel: logs and tracing

  2. Habilitar parámetros para la depuración de Java (opcional, pero útil, es decir, problemas con el apretón de manos TLS/SSL como close_notify o handshake_failure) & lanzamiento de la JNLP, hay dos maneras en que puede hacerlo:

    2.a. Descargue el archivo JNLP y ejecútelo desde la línea de comandos (el comando SET no es necesario en este caso particular).

    set JAVA_TOOL_OPTIONS=-Djavax.net.debug=all 
    javaws -wait jnlp.jnlp 
    

    2.b. Agregar argumentos (es decir -Djavax.net.debug=all) para la JVM en el Panel de control de Java> Java> Ver (esto no es necesario en este particular), y ejecute el archivo JNLP desde el navegador:

    Java Control Panel: jvm arguments

  3. Los registros y seguimientos se encuentran en el directorio log desde Java Deployment Home desde donde pego estas ubicaciones:

    a. Windows XP: %HOME%\Application Data\Sun\Java\Deployment

    b. Windows 7/Vista: %APPDATA%\..\LocalLow\Sun\Java\Deployment

    c. Linux/Solaris: %HOME%/.java/deployment

Con javax.net.debug = todo lo que verá el apretón de manos si el frasco dentro de la jnlp se carga desde una conexión HTTPS. Este tipo de problemas son difíciles de depurar.

... 
%% No cached client session 
*** ClientHello, TLSv1.2 
... 
*** 
... 
Java Web Start Main Thread, received EOFException: error 
Java Web Start Main Thread, handling exception: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake 
Java Web Start Main Thread, SEND TLSv1.2 ALERT: fatal, description = handshake_failure 
Java Web Start Main Thread, WRITE: TLSv1.2 Alert, length = 2 
Java Web Start Main Thread, called closeSocket() 
#### Java Web Start Error: 
+1

Se mezcla la depuración con el registro/seguimiento. – Horcrux7

+0

@ Horcrux7 tienes razón. Creo que el registro se puede ver como una forma de depuración :) – lmiguelmh

Cuestiones relacionadas