¿Cómo depurar la aplicación Spring Boot con Eclipse?

100

Mi aplicación Spring Bootweb funciona bien y me gustaría depurarla a través de Eclipse.

Entonces, al iniciar mi depurador de aplicaciones Java remotas, ¿qué puerto debo escuchar? ¿Y hay alguna configuración en mi aplicación web que deba configurar para habilitar la depuración?

JeffLL
fuente
En STS 3.9.4.RELEASE en Linux Mint 18 Sarah, tengo que entrar en la perspectiva de depuración para depurar las aplicaciones Spring Boot.
TimeTrap

Respuestas:

167

¿Por qué no hace clic derecho en el main()método y elige "Debug As... Java Application"?

Dave Syer
fuente
No había pensado en eso. Estoy probando una aplicación de descanso. Lanzarlo y luego presionarlo con mi navegador con diferentes configuraciones.
JeffLL
8
Hay ocasiones en las que es posible que sea necesario depurar la aplicación que se ejecuta de forma remota en un servidor, donde esto no se aplicaría.
Cuga
No funcionó para mí. "El editor no contiene un tipo principal"
Raj
¿Supongo que no hizo "clic derecho en el método main ()" entonces?
Dave Syer
4
Mi situación era diferente, Ejecutar Main directamente no estaba recogiendo algunos archivos de configuración de primavera, es decir, bootstrap.xml, luego tuve que cambiar a ejecutarlo como maven spring-boot: run. Pero el problema es que, aunque esté ejecutando este objetivo experto desde eclipse, no lo depurará.
sanjay patel
91

Hay una sección 19.2 en Spring Boot Reference que le informa sobre cómo iniciar su aplicación con el soporte de depuración remota habilitado.

$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
   -jar target/myproject-0.0.1-SNAPSHOT.jar

Después de iniciar su aplicación, simplemente agregue la configuración de la Aplicación Java Remota en las configuraciones Ejecutar / Depurar, seleccione el puerto / dirección que definió al iniciar su aplicación, y luego podrá depurar.

maestro
fuente
Esto funcionó para mí. ¡Gracias! Eclipse no pudo depurar mi proyecto de arranque de primavera (seguía quejándome de que no se podía encontrar la clase Main).
user6123723
4
Tenga en cuenta que con Java 8 (no conozco otras versiones), la ejecución java -agentlib:jdwp=helpindica "La interfaz anterior -Xrunjdwp aún se puede usar, pero se eliminará en una versión futura". En su lugar use-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n
Paul
23

Solución más sencilla:

En lugar de escribir mvn spring-boot:run, simplemente escribamvnDebug spring-boot:run

Aún necesitará adjuntar el depurador en Eclipse realizando una nueva configuración de depuración para una "Aplicación Java remota" en el puerto correspondiente.

Duran Wesley Harris
fuente
3
¿Cómo especificaría entonces un número de puerto que no sea el predeterminado?
Stephane
19

No necesitaba configurar la depuración remota para que esto funcionara, usé Maven.

  1. Asegúrese de tener el complemento Maven instalado en Eclipse.
  2. Haga clic en Ejecutar> Ejecutar configuraciones> Maven Build> nueva configuración de lanzamiento :
    • Directorio base: busque la raíz de su proyecto
    • Objetivos: spring-boot::run.
  3. Haga clic en Aplicar y luego en Ejecutar .

NÓTESE BIEN. Si su IDE tiene problemas para encontrar el código fuente de su proyecto al realizar la depuración línea por línea, eche un vistazo a esta respuesta SO para averiguar cómo adjuntar manualmente su código fuente a la aplicación de depuración.

¡Espero que esto ayude a alguien!

Dawngerpony
fuente
Si ejecuta el servidor con spring-boot: run, no podrá detenerlo simplemente presionando el ícono rojo en la ventana de la consola.
Shailesh Pratapwar
Puedo detenerlo así (puede que necesite netstat instalado, olvido si hice un binario o vine con Cygwin, o parte de Windows ahora): netstat -ano | grep "9999": devuelve el ID de tarea 36308 en Windows taskkill / F / PID 36308
armyofda12mnkeys
19

Cómo depurar una aplicación Spring Boot de producción o puesta en escena remota

Lado del servidor

Supongamos que ha seguido con éxito la guía de Spring Boot para configurar su aplicación Spring Boot como servicio . El artefacto de su aplicación reside en /srv/my-app/my-app.war, acompañado de un archivo de configuración /srv/my-app/my-app.conf:

# This is file my-app.conf
# What can you do in this .conf file? The my-app.war is prepended with a SysV init.d script
# (yes, take a look into the war file with a text editor). As my-app.war is symlinked in the init.d directory, that init.d script
# gets executed. One of its step is actually `source`ing this .conf file. Therefore we can do anything in this .conf file that
# we can also do in a regular shell script.

JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,address=localhost:8002,server=y,suspend=n"
export SPRING_PROFILES_ACTIVE=staging

Cuando reinicie su aplicación Spring Boot con sudo service my-app restart, entonces en su archivo de registro ubicado en /var/log/my-app.logdebería haber una línea que diga Listening for transport dt_socket at address: 8002.

Lado del cliente (máquina de desarrollador)

Abrir una redirección de puertos SSH túnel para el servidor: ssh -L 8002:localhost:8002 [email protected]. Mantenga esta sesión SSH en ejecución.

En Eclipse, desde la barra de herramientas, seleccione Ejecutar -> Configuraciones de depuración -> seleccione Aplicación Java remota -> haga clic en el botón Nuevo -> seleccione como Tipo de conexión Estándar (Conexión de socket) , como Host localhost y como Puerto 8002 (o lo que tenga configurado en los pasos anteriores). Haga clic en Aplicar y luego en Depurar .

El depurador de Eclipse ahora debería conectarse al servidor remoto. El cambio a la perspectiva de depuración debería mostrar la JVM conectada y sus subprocesos. Los puntos de interrupción deben activarse tan pronto como se activen de forma remota.

Abdull
fuente
El reenvío de puertos y la tunelización era lo que me faltaba. Ejército de reserva. Crucial si está depurando a un servidor basado en Internet, digamos en Amazon.
PaulNUK
14

Ejecutar debajo del comando donde pom.xmlse coloca:

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"

E inicie su aplicación java remota con la opción de depuración en el puerto5005

Arpit Aggarwal
fuente
2
Esto no puede esperar a que se conecte un depurador Spring Boot 2.0.3.RELEASE.
Stephane
10

En mi opinión, la mejor solución es agregar un complemento en pom.xml, y no es necesario que haga nada más todo el tiempo:

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <jvmArguments>
                        -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9898
                    </jvmArguments>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
krmanish007
fuente
Pero luego el comando mvn clean installactiva el depurador y la compilación se bloquea. Sería genial si solo el mvnDebug clean installcomando lo hiciera.
Stephane
1
@ Stephane, esta configuración probablemente debería estar en un perfil específico fácil de habilitar
davidxxx
4
  • haga clic derecho en su proyecto y elija "Depurar como => Aplicación Java o Aplicación Spring boot" -capture1 - ingrese la descripción de la imagen aquí
  • Si desea que su aplicación se detenga en algún lugar de su aplicación, haga doble clic a la izquierda, tendrá esta captura 2. ingrese la descripción de la imagen aquí
  • luego, cuando inicie su aplicación, use esas flechas para ir a continuación. (captura 3) ingrese la descripción de la imagen aquí
Abdelwahid Oubaalla
fuente
Esta es una buena respuesta a la pregunta del título. Sin embargo, la descripción tiene una pregunta más específica y diferente, que requiere una respuesta diferente.
Thor Hovden
Entonces solía usar MyEclispe y la opción Depurar como -> Aplicación Spring Boot estaba disponible y funcionaba bien. No estoy usando Eclipse Oxygen y el elemento de menú de la aplicación Spring Boot ya no está disponible. ¿Necesito instalar un complemento para eclipse para obtener esto?
Kachopsticks
3

Right click on the spring boot project -> debug as -> spring boot App. Ponga un punto de depuración e invoque la aplicación desde un cliente como cartero

Tadele Ayelegn
fuente
2

Consulte http://java.dzone.com/articles/how-debug-remote-java-applicat para habilitar la depuración remota. Si está utilizando tomcat para ejecutar su aplicación, inicie tomcat con parámetros de depuración remotos o puede iniciar tomcat con soporte JPDA usando el siguiente comando.

Ventanas

<tomcat bin dir>/startup.bat jpda

*nada

<tomcat bin dir>/startup.sh jpda

esto permitirá la depuración remota en el puerto 8000

Sangram Jadhav
fuente
2

Con eclipse o cualquier otro IDE, simplemente haga clic derecho en su aplicación principal de arranque de primavera y haga clic en "depurar como aplicación java"

adia
fuente
2

Esta pregunta ya está respondida, pero también tengo el mismo problema para depurar Springboot + gradle + jHipster,

En su mayoría, la aplicación de arranque Spring puede depurar haciendo clic con el botón derecho y depurar, pero cuando usa gradle, al tener alguna configuración de parámetros de entorno adicional, no es posible depurar directamente.

Para resolver esto, Eclipse proporcionó una característica adicional como Aplicación Java Remota

Al utilizar estas funciones, puede depurar su aplicación.

Siga el siguiente paso:

ejecuta tu aplicación gradle con el ./gradlew bootRun --debug-jvmcomando

Ahora vaya a eclipse -> haga clic derecho en proyecto y configuración de depuración -> Aplicación Java remota.

agregue su host y puerto como localhost y puerto como 5005 (predeterminado para la depuración de gradle, puede cambiarlo)

Consulte para obtener más detalles y pasos.

bharatpatel
fuente
0

Haga clic con el botón derecho en el archivo de clase principal de Spring Boot Applications -> seleccione las opciones Depurar como -> Seleccione la aplicación Java

ingrese la descripción de la imagen aquí Ahora puede utilizar puntos de interrupción para depurar la aplicación.

Bishal Jaiswal
fuente