Wie debugge ich eine Spring Boot-Anwendung mit Eclipse?

100

Meine Spring BootWebanwendung läuft einwandfrei und ich möchte sie über Eclipse debuggen.

Welchen Port sollte ich beim Starten meines Remote-Java-Anwendungsdebuggers abhören? Und gibt es eine Einstellung in meiner Webanwendung, die ich festlegen muss, um das Debuggen zu aktivieren?

JeffLL
quelle
In STS 3.9.4.RELEASE unter Linux Mint 18 Sarah muss ich in die Debug-Perspektive gehen, um Spring Boot-Anwendungen zu debuggen.
TimeTrap

Antworten:

166

Warum klicken Sie nicht einfach mit der rechten Maustaste auf die main()Methode und wählen sie aus "Debug As... Java Application"?

Dave Syer
quelle
Daran hatte ich nicht gedacht. Ich teste eine Ruhe-App. Starten Sie es und treffen Sie es dann mit meinem Browser mit verschiedenen Konfigurationen.
JeffLL
8
Es kann vorkommen, dass die Anwendung, die remote auf einem Server ausgeführt wird, debuggt werden muss, wenn dies nicht der Fall ist.
Cuga
Es hat bei mir nicht funktioniert. "Editor enthält keinen Haupttyp"
Raj
Ich denke, Sie haben dann nicht "mit der rechten Maustaste auf die main () -Methode geklickt"?
Dave Syer
4
Meine Situation war anders, aber Running Main hat nicht direkt einige Spring-Konfigurationsdateien aufgenommen, z. B. bootstrap.xml. Dann musste ich darauf umsteigen, es als Maven Spring-Boot: Run auszuführen. Das Problem dabei ist jedoch, dass dieses Maven-Ziel, obwohl es von Eclipse aus ausgeführt wird, nicht debuggt wird.
Sanjay Patel
91

In Abschnitt 19.2 der Spring Boot Reference finden Sie Informationen zum Starten Ihrer Anwendung mit aktivierter Remote-Debugging-Unterstützung.

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

Nachdem Sie Ihre Anwendung gestartet haben, fügen Sie einfach diese Remote Java Application-Konfiguration in Run / Debug-Konfigurationen hinzu, wählen Sie den Port / die Adresse aus, die Sie beim Starten Ihrer App definiert haben, und Sie können dann debuggen.

Masster
quelle
Das hat bei mir funktioniert. Vielen Dank! Eclipse konnte mein Spring-Boot-Projekt nicht debuggen (beschwerte sich, dass die Hauptklasse nicht gefunden werden konnte).
user6123723
4
Beachten Sie, dass unter Java 8 (ich kenne keine anderen Versionen) die java -agentlib:jdwp=helpStatus "Die ältere -Xrunjdwp-Schnittstelle kann weiterhin verwendet werden, wird aber in einer zukünftigen Version entfernt". Verwenden Sie stattdessen-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n
Paul
23

Einfachere Lösung:

Anstatt zu mvn spring-boot:runtippen, tippen Sie einfachmvnDebug spring-boot:run

Sie müssen den Debugger weiterhin in Eclipse anhängen, indem Sie eine neue Debug-Konfiguration für eine "Remote-Java-Anwendung" am entsprechenden Port vornehmen.

Duran Wesley Harris
quelle
3
Wie würden Sie dann eine andere als die Standardportnummer angeben?
Stephane
19

Ich musste kein Remote-Debugging einrichten, um dies zum Laufen zu bringen. Ich habe Maven verwendet.

  1. Stellen Sie sicher, dass Sie das Maven-Plugin in Eclipse installiert haben.
  2. Klicken Sie auf Ausführen> Konfigurationen ausführen> Maven Build> Neue Startkonfiguration :
    • Basisverzeichnis: Navigieren Sie zum Stammverzeichnis Ihres Projekts
    • Ziele : spring-boot::run.
  3. Klicken Sie auf Übernehmen und dann auf Ausführen .

NB. Wenn Ihre IDE beim zeilenweisen Debuggen Probleme hat, den Quellcode Ihres Projekts zu finden, lesen Sie diese SO-Antwort , um herauszufinden, wie Sie Ihren Quellcode manuell an die Debug-Anwendung anhängen können.

Hoffe das hilft jemandem!

Dawngerpony
quelle
Wenn Sie den Server mit spring-boot: run ausführen, können Sie ihn nicht stoppen, indem Sie einfach auf das rote Symbol im Konsolenfenster klicken.
Shailesh Pratapwar
Ich kann es so stoppen (möglicherweise muss netstat installiert sein, ich vergesse, wenn ich eine Binärdatei erstellt habe oder mit Cygwin oder einem Teil von Windows gekommen bin): netstat -ano | grep "9999" - gibt die 36308-Task-ID in Windows Taskkill / F / PID 36308 zurück
Armyofda12mnkeys
19

Debuggen einer Remote-Staging- oder Produktions-Spring Boot-Anwendung

Serverseitig

Angenommen, Sie haben die Anleitung von Spring Boot zum Einrichten Ihrer Spring Boot-Anwendung als Dienst erfolgreich befolgt . Ihr Anwendungsartefakt befindet sich in /srv/my-app/my-app.war, zusammen mit einer Konfigurationsdatei /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

Wenn Sie Ihre Spring Boot-Anwendung mit neu starten sudo service my-app restart, sollte in der Protokolldatei /var/log/my-app.logunter eine Zeile mit der Aufschrift stehen Listening for transport dt_socket at address: 8002.

Clientseitig (Entwicklermaschine)

Öffnen Sie einen SSH-Portweiterleitungstunnel zum Server : ssh -L 8002:localhost:8002 [email protected]. Lassen Sie diese SSH-Sitzung laufen.

Wählen Sie in Eclipse in der Symbolleiste Ausführen -> Debug-Konfigurationen -> Remote-Java-Anwendung auswählen -> Klicken Sie auf die Schaltfläche Neu -> Wählen Sie als Verbindungstyp Standard (Socket Attach) , als Host localhost und als Port 8002 (oder was auch immer Sie haben) aus in den vorhergehenden Schritten konfiguriert). Klicken Sie auf Übernehmen und dann auf Debuggen .

Der Eclipse-Debugger sollte jetzt eine Verbindung zum Remote-Server herstellen. Wenn Sie zur Debug- Perspektive wechseln, sollten die verbundene JVM und ihre Threads angezeigt werden. Haltepunkte sollten ausgelöst werden, sobald sie aus der Ferne ausgelöst werden.

Abdull
quelle
Port Forwarding und das Tunneln waren das, was mir fehlte. Ta. Entscheidend, wenn Sie auf einem internetbasierten Server debuggen, beispielsweise bei Amazon.
PaulNUK
14

Führen Sie den folgenden Befehl aus, wo er pom.xmlplatziert ist:

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

Starten Sie Ihre Remote-Java-Anwendung mit der Debugging-Option am Port5005

Arpit Aggarwal
quelle
2
Dies wartet nicht darauf, dass ein Debugger angehängt wird Spring Boot 2.0.3.RELEASE.
Stephane
10

Die beste Lösung ist meiner Meinung nach, ein Plugin in die Datei pom.xml einzufügen, und Sie müssen nicht die ganze Zeit etwas anderes tun:

<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
quelle
Aber dann mvn clean installlöst der Befehl den Debugger aus und der Build hängt. Es wäre cool, wenn nur der mvnDebug clean installBefehl dies tun würde.
Stephane
1
@Stephane, diese Konfiguration sollte wahrscheinlich in einem bestimmten Profil sein, das einfach zu aktivieren ist
davidxxx
4
  • Klicken Sie mit der rechten Maustaste auf Ihr Projekt und wählen Sie "Debug As => Java-Anwendung oder Spring Boot App" -capture1 - Geben Sie hier die Bildbeschreibung ein
  • Wenn Sie möchten, dass Ihre Anwendung irgendwo in Ihrer App pausiert, doppelklicken Sie links, um diese Aufnahme 2 zu erhalten. Geben Sie hier die Bildbeschreibung ein
  • Wenn Sie dann Ihre App starten, verwenden Sie diese Pfeile, um als Nächstes fortzufahren. (Capture 3) Geben Sie hier die Bildbeschreibung ein
Abdelwahid Oubaalla
quelle
Dies ist eine gute Antwort auf die Titelfrage. Die Beschreibung enthält jedoch eine spezifischere und andere Frage, die eine andere Antwort erfordert.
Thor Hovden
Also habe ich MyEclispe verwendet und die Option Debug As -> Spring Boot App war verfügbar und hat gut funktioniert. Ich verwende Eclipse Oxygen nicht und der Menüpunkt Spring Boot App ist nicht mehr verfügbar. Muss ich ein Plugin für Eclipse installieren, um dies zu erhalten?
Kachopsticks
3

Right click on the spring boot project -> debug as -> spring boot App. Setzen Sie einen Debugger-Punkt und rufen Sie die App von einem Client wie einem Postboten auf

Tadele Ayelegn
quelle
2

Informationen zum Aktivieren des Remote-Debuggens finden Sie unter http://java.dzone.com/articles/how-debug-remote-java-applicat . Wenn Sie Tomcat zum Ausführen Ihrer Anwendung verwenden, starten Sie Tomcat mit Remote-Debug-Parametern, oder Sie können Tomcat mit JPDA-Unterstützung starten, indem Sie den folgenden Befehl verwenden.

Windows

<tomcat bin dir>/startup.bat jpda

* nix

<tomcat bin dir>/startup.sh jpda

Dadurch wird das Remote-Debugging auf Port 8000 aktiviert

Sangram Jadhav
quelle
2

Klicken Sie bei Eclipse oder einer anderen IDE mit der rechten Maustaste auf Ihre Haupt-Spring-Boot-Anwendung und klicken Sie auf "Als Java-Anwendung debuggen".

adia
quelle
2

Diese Frage ist bereits beantwortet, aber ich habe auch das gleiche Problem beim Debuggen von Springboot + gradle + jHipster.

Meistens kann die Spring-Boot-Anwendung per Rechtsklick debuggen und debuggen. Wenn Sie jedoch gradle verwenden und einige zusätzliche Umgebungsparameter einrichten, ist ein direktes Debuggen nicht möglich.

Um dies zu beheben, stellte Eclipse eine zusätzliche Funktion als Remote-Java-Anwendung bereit

Mit diesen Funktionen können Sie Ihre Anwendung debuggen.

Befolgen Sie den folgenden Schritt:

Führen Sie Ihre Gradle-Anwendung mit dem ./gradlew bootRun --debug-jvmBefehl aus

Gehen Sie nun zu Eclipse -> Rechtsklick auf Projekt und Debug-Konfiguration -> Remote-Java-Anwendung.

Fügen Sie Ihren Host und Port als localhost und Port als 5005 hinzu (Standard für Gradle-Debug, Sie können es ändern)

Siehe für weitere Einzelheiten und Schritt.

Bharatpatel
quelle
0

Klicken Sie mit der rechten Maustaste auf die Hauptklassendatei von Spring Boot Applications -> wählen Sie Debug As- Optionen -> Java Application auswählen

Geben Sie hier die Bildbeschreibung ein Jetzt können Sie Haltepunkte zum Debuggen der Anwendung verwenden.

Bishal Jaiswal
quelle