Spring-Anwendungen debuggen

Debuggen von Spring-Anwendungen

1. Einführung

Das Debuggen ist eines der wichtigsten Tools zum Schreiben von Software.

In diesem Tutorial werden einige Möglichkeiten zum Debuggen von Spring-Anwendungen beschrieben.

Wir werden auch sehen, wie Spring Boot, herkömmliche Anwendungsserver und IDEs dies vereinfachen.

2. Java Debug Args

Schauen wir uns zunächst an, was Java uns sofort bietet.

By default, the JVM does not enable debugging. Dies liegt daran, dass das Debuggen zusätzlichen Overhead in der JVM verursacht. Dies kann auch ein Sicherheitsrisiko für öffentlich zugängliche Anwendungen sein.

Daherdebugging should only be performed during development und niemals auf Produktionssystemen.

Bevor wir einen Debugger anfügen können, müssen wir zuerst die JVM konfigurieren, um das Debuggen zu ermöglichen. Dazu legen wir ein Befehlszeilenargument für die JVM fest:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

Lassen Sie uns zusammenfassen, was jeder dieser Werte bedeutet:

-agentlib: jdwp

Aktivieren Sie den JDWP-Agenten (Java Debug Wire Protocol) in der JVM. This is the main command line argument that enables debugging.

transport = dt_socket

Verwenden Sie einen Netzwerk-Socket zum Debuggen von Verbindungen. Weitere Optionen sind Unix-Sockets und Shared Memory.

Server = y

Lauschen Sie eingehenden Debugger-Verbindungen. Bei Einstellung aufn versucht der Prozess, eine Verbindung zu einem Debugger herzustellen, anstatt auf eingehende Verbindungen zu warten. Zusätzliche Argumente sind erforderlich, wenn dies aufn gesetzt ist.

suspend = n

Warten Sie beim Start nicht auf eine Debug-Verbindung. Die Anwendung wird normal gestartet und ausgeführt, bis ein Debugger angeschlossen wird. Bei Einstellung aufy wird der Prozess erst gestartet, wenn ein Debugger angeschlossen ist.

Adresse = 8000

Der Netzwerkport, den die JVM auf Debug-Verbindungen überwacht.

Die obigen Werte sind Standardwerte und funktionieren für die meisten Anwendungsfälle und Betriebssysteme. DasJPDA connection guide deckt alle möglichen Werte detaillierter ab.

3. Spring Boot-Anwendungen

Spring Boot-Anwendungencan be started several ways. Der einfachste Weg ist über die Befehlszeile mit dem Befehljava mit der Option-jar.

Um das Debuggen zu aktivieren, fügen wir einfach das Debug-Argument mit der Option-Dhinzu:

java -jar myapp.jar -Dagentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

Mit Maven können wir das bereitgestellte Ziel vonrunverwenden, um unsere Anwendung mit aktiviertem Debugging zu starten:

mvn spring-boot:run -Dagentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

Ebenso können wir mit Gradle die AufgabebootRunverwenden. Zuerst müssen wir die Dateibuild.gradleaktualisieren, um sicherzustellen, dass Gradle Befehlszeilenargumente an die JVM übergibt:

bootRun {
   systemProperties = System.properties
}

Jetzt können wir die AufgabebootRunausführen:

gradle bootRun -Dagentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

4. Anwendungsserver

Während Spring Boot in den letzten Jahren sehr populär geworden ist, sind traditionelleapplication serversin modernen Softwarearchitekturen immer noch weit verbreitet. In diesem Abschnitt erfahren Sie, wie Sie das Debuggen für einige der beliebtesten Anwendungsserver aktivieren.

Die meisten Anwendungsserver bieten ein Skript zum Starten und Stoppen von Anwendungen. Das Aktivieren des Debugs ist in der Regel nur eine Frage des Hinzufügens zusätzlicher Argumente zu diesem Skript und / oder des Festlegens zusätzlicher Umgebungsvariablen.

4.1. Kater

Das Startskript fürTomcat heißtcatalina.sh (catalina.bat unter Windows). Um einen Tomcat-Server mit aktiviertem Debug zu starten, können wir den Argumentenjpda voranstellen:

catalina.sh jpda start

Die Standard-Debug-Argumente verwenden einen Netzwerk-Socket, der Port 8000 mitsuspend=n überwacht. Diese können geändert werden, indem eine oder mehrere der folgenden Umgebungsvariablen festgelegt werden:JPDA_TRANSPORT,JPDA_ADDRESS undJPDA_SUSPEND.

Wir können auch die vollständige Kontrolle über die Debug-Argumente erlangen, indem wirJPDA_OPTS setzen. Wenn diese Variable festgelegt ist, hat sie Vorrang vor den anderen JPDA-Variablen. Daher muss es ein vollständiges Debug-Argument für die JVM sein.

4.2. Wildfliege

Das Startskript fürWildfly iststand-alone.sh. Um einen Wildfly-Server mit aktiviertem Debug zu starten, können wir–debug hinzufügen.

Der Standard-Debug-Modus verwendet einen Netzwerk-Listener an Port 8787 mitsuspend=n. Wir können den Port überschreiben, indem wir ihn nach dem Argument–debugangeben.

Für mehr Kontrolle über das Debug-Argument können wir einfach die vollständigen Debug-Argumente zur UmgebungsvariablenJAVA_OPTShinzufügen.

4.3. Weblogic

Das Startskript für Weblogic lautetstartWeblogic.sh. Um einen Weblogic-Server mit aktiviertem Debug zu starten, können Sie die UmgebungsvariabledebugFlag auftrue setzen.

Der Standard-Debug-Modus verwendet einen Netzwerk-Listener an Port 8453 mitsuspend=n. Wir können den Port überschreiben, indem wir die UmgebungsvariableDEBUG_PORTfestlegen.

Für mehr Kontrolle über das Debug-Argument können wir einfach die vollständigen Debug-Argumente zur UmgebungsvariablenJAVA_OPTIONShinzufügen.

Die neuesten Versionen von Weblogic bieten auch ein Maven-Plugin zum Starten und Stoppen von Servern. This plugin will honor the same environment variables as the startup script.

4.4. Glasfische

Das Startskript für Glassfish lautetasadmin. Um einen Glassfish-Server mit aktiviertem Debug zu starten, müssen wir–debug verwenden:

asadmin start-domain --debug

Der Standard-Debug-Modus verwendet einen Netzwerk-Listener an Port 9009 mitsuspend=n.

4.5. Anlegesteg

Der Jetty-Anwendungsserver wird ohne Startskript geliefert. Stattdessen werden Jetty-Server mit dem Befehljavagestartet.

Daher ist das Aktivieren des Debuggens so einfach wie das Hinzufügen der Standard-JVM-Befehlszeilenargumente.

5. Debuggen von einer IDE

Nachdem wir nun gesehen haben, wie das Debuggen in verschiedenen Anwendungstypen aktiviert wird, schauen wir uns an, wie Sie einen Debugger verbinden.

Jede moderne IDE bietet Debugging-Unterstützung. Dies umfasst sowohl die Fähigkeit, einen neuen Prozess mit aktiviertem Debugging zu starten, als auch die Fähigkeit, einen bereits laufenden Prozess zu debuggen.

5.1. IntelliJ

IntelliJ bietet erstklassige Unterstützung für Spring- und Spring Boot-Anwendungen. Das Debuggen ist so einfach wie das Navigieren zur Klasse mit der Methodemain, das Klicken mit der rechten Maustaste auf das Dreieckssymbol und die Auswahl von Debuggen.

image

Wenn ein Projekt mehrere Spring Boot-Anwendungen enthält, bietet IntelliJ ein Fenster mit dem Tool "Dashboard ausführen". In diesem Fenster können wir mehrere Spring Boot-Anwendungen von einem einzigen Ort aus debuggen:

image

Für Anwendungen, die Tomcat oder andere Webserver verwenden, können wir eine benutzerdefinierte Konfiguration für das Debuggen erstellen. UnterRun>Edit Configurations gibt es eine Reihe von Vorlagen für die gängigsten Anwendungsserver:

image

Schließlich macht es IntelliJ sehr einfach, eine Verbindung zu einem laufenden Prozess herzustellen und diesen zu debuggen. As long as the application was started with the proper debug arguments kann IntelliJ eine Verbindung herstellen, auch wenn es sich auf einem anderen Host befindet.

Auf dem BildschirmRun/Debug Configurations können Sie mit der VorlageRemotekonfigurieren, wie eine Verbindung zur bereits ausgeführten Anwendung hergestellt werden soll:

image

Beachten Sie, dass IntelliJ nur den Hostnamen und den Debug-Port kennen muss. Der Einfachheit halber werden die richtigen JVM-Befehlszeilenargumente angegeben, die für die zu debuggende Anwendung verwendet werden sollen.

5.2. Finsternis

Der schnellste Weg, eine Spring Boot-Anwendung in Eclipse zu debuggen, besteht darin, mit der rechten Maustaste auf die Hauptmethode in den FensternPackage Explorer oderOutlinezu klicken:

image

Die Standardinstallation von Eclipse unterstützt weder Spring noch Spring Boot. Auf dem Eclipse-Marktplatz sind jedochSpring Tools add-onverfügbar, die Spring-Unterstützung bieten, die mit IntelliJ vergleichbar ist.

Vor allemthe add-on provides a Boot Dashboard that lets us manage multiple Spring Boot applications from a single place:

image

Das Add-On bietet auch eineSpring Boot Run / Debug-Konfiguration, mit der das Debuggen einer einzelnen Spring Boot-Anwendung angepasst werden kann. Diese benutzerdefinierte Ansicht ist an denselben Stellen verfügbar wie die Standardkonfiguration vonJava Application.

Um einen bereits laufenden Prozess entweder lokal oder auf einem Remote-Host zu debuggen, können Sie die Konfiguration vonRemote Java Applicationverwenden:

image

6. Debuggen mit Docker

Das Debuggen vonSpring application inside a Docker container erfordert möglicherweise eine zusätzliche Konfiguration. If the container is running locally and is not using host network mode, dann ist der Debug-Port außerhalb des Containers nicht zugänglich.

Es gibt verschiedene Möglichkeiten, den Debug-Port in Docker verfügbar zu machen.

Wir können–expose mit dem Befehldocker run verwenden:

docker run --expose 8000 mydockerimage

Wir können auch die DirektiveEXPOSE zuDockerfile hinzufügen:

EXPOSE 8000

Wenn wir Docker Compose verwenden, können wir es der YAML hinzufügen:

expose:
 - "8000"

7. Fazit

In diesem Artikel haben wir gesehen, wie Sie das Debuggen für jede Java-Anwendung aktivieren.

Durch einfaches Hinzufügen eines einzelnen Befehlszeilenarguments können wir leicht eine Java-Anwendung debuggen.

Wir haben auch festgestellt, dass sowohl Maven als auch Gradle sowie die gängigsten IDEs über spezielle Add-Ons verfügen, die das Debuggen von Spring- und Spring Boot-Anwendungen noch einfacher machen.