Debug delle applicazioni Spring

1. Introduzione

Il debug è uno degli strumenti più importanti per la scrittura di software.

In questo tutorial, esamineremo alcuni dei modi in cui possiamo eseguire il debug delle applicazioni Spring.

Vedremo anche come Spring Boot, i server delle applicazioni tradizionali e gli IDE lo semplificano.

2. Argomenti di debug Java

Per prima cosa, diamo un'occhiata a ciò che Java ci offre fuori dagli schemi.

Per impostazione predefinita, la JVM non abilita il debug . Questo perché il debug crea un sovraccarico aggiuntivo all'interno della JVM. Può anche rappresentare un problema di sicurezza per le applicazioni accessibili pubblicamente.

Pertanto, il debug deve essere eseguito solo durante lo sviluppo e mai sui sistemi di produzione.

Prima di poter collegare un debugger, dobbiamo prima configurare la JVM per consentire il debug. Lo facciamo impostando un argomento della riga di comando per la JVM:

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

Analizziamo il significato di ciascuno di questi valori:

-agentlib: jdwp

Abilitare l'agente JDWP (Java Debug Wire Protocol) all'interno della JVM. Questo è l'argomento principale della riga di comando che abilita il debug.

trasporto = dt_socket

Utilizzare una presa di rete per le connessioni di debug. Altre opzioni includono socket Unix e memoria condivisa.

server = y

Ascolta le connessioni del debugger in arrivo. Quando è impostato su n , il processo proverà a connettersi a un debugger invece di attendere le connessioni in entrata. Sono richiesti argomenti aggiuntivi quando è impostato su n .

sospendere = n

Non attendere una connessione di debug all'avvio. L'applicazione verrà avviata e verrà eseguita normalmente finché non verrà collegato un debugger. Se impostato su y , il processo non verrà avviato fino a quando non verrà collegato un debugger.

indirizzo = 8000

La porta di rete che la JVM ascolterà per le connessioni di debug.

I valori sopra sono standard e funzionano per la maggior parte dei casi d'uso e dei sistemi operativi. La guida alla connessione JPDA copre tutti i valori possibili in modo più dettagliato.

3. Applicazioni Spring Boot

Le applicazioni Spring Boot possono essere avviate in diversi modi. Il modo più semplice è dalla riga di comando utilizzando il comando java con l' opzione -jar .

Per abilitare il debug, dovremmo semplicemente aggiungere l'argomento debug usando l' opzione -D :

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

Con Maven, possiamo utilizzare l' obiettivo di esecuzione fornito per avviare la nostra applicazione con il debug abilitato:

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

Allo stesso modo, con Gradle, possiamo usare il task bootRun . Innanzitutto, dobbiamo aggiornare il file build.gradle per assicurarci che Gradle passi gli argomenti della riga di comando alla JVM:

bootRun { systemProperties = System.properties }

Ora possiamo eseguire l' attività bootRun :

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

4. Server delle applicazioni

Sebbene Spring Boot sia diventato molto popolare negli ultimi anni, i server delle applicazioni tradizionali sono ancora piuttosto diffusi nelle moderne architetture software. In questa sezione vedremo come abilitare il debug per alcuni dei server delle applicazioni più popolari.

La maggior parte dei server delle applicazioni fornisce uno script per l'avvio e l'arresto delle applicazioni. Abilitare il debug è in genere solo questione di aggiungere ulteriori argomenti a questo script e / o impostare variabili di ambiente aggiuntive.

4.1. Tomcat

Lo script di avvio per Tomcat si chiama catalina.sh ( catalina.bat su Windows). Per avviare un server Tomcat con il debug abilitato possiamo anteporre jpda agli argomenti:

catalina.sh jpda start

Gli argomenti di debug predefiniti utilizzeranno un socket di rete in ascolto sulla porta 8000 con suspend = n . Queste possono essere modificate impostando una o più delle seguenti variabili di ambiente: JPDA_TRANSPORT , JPDA_ADDRESS e JPDA_SUSPEND .

Possiamo anche ottenere il pieno controllo degli argomenti di debug impostando JPDA_OPTS . Quando questa variabile è impostata, ha la precedenza sulle altre variabili JPDA. Quindi deve essere un argomento di debug completo per la JVM.

4.2. Volo selvaggio

Lo script di avvio per Wildfly è stand-alone.sh . Per avviare un server Wildfly con il debug abilitato possiamo aggiungere –debug .

La modalità di debug predefinita utilizza un listener di rete sulla porta 8787 con suspend = n . Possiamo sovrascrivere la porta specificandola dopo l' argomento –debug .

Per un maggiore controllo sull'argomento di debug, possiamo semplicemente aggiungere gli argomenti di debug completi alla variabile d'ambiente JAVA_OPTS .

4.3. Weblogic

Lo script di avvio per Weblogic è startWeblogic.sh . Per avviare un server Weblogic con debug abilitato possiamo impostare la variabile d'ambiente debugFlag su true .

La modalità di debug predefinita utilizza un listener di rete sulla porta 8453 con suspend = n . Possiamo sovrascrivere la porta impostando la variabile d'ambiente DEBUG_PORT .

Per un maggiore controllo sull'argomento di debug, possiamo semplicemente aggiungere gli argomenti di debug completi alla variabile d'ambiente JAVA_OPTIONS .

Le ultime versioni di Weblogic forniscono anche un plugin Maven per avviare e arrestare i server. Questo plugin rispetterà le stesse variabili d'ambiente dello script di avvio .

4.4. Glassfish

Lo script di avvio per Glassfish è asadmin . Per avviare un server Glassfish con il debug abilitato dobbiamo usare –debug :

asadmin start-domain --debug

La modalità di debug predefinita utilizza un listener di rete sulla porta 9009 con suspend = n .

4.5. Molo

Il server delle applicazioni Jetty non viene fornito con uno script di avvio. Invece, i server Jetty vengono avviati utilizzando il comando java .

Pertanto, abilitare il debug è semplice come aggiungere gli argomenti della riga di comando JVM standard.

5. Debug da un IDE

Ora che abbiamo visto come abilitare il debug in vari tipi di applicazioni, diamo un'occhiata al collegamento di un debugger.

Ogni moderno IDE offre supporto per il debug. Ciò include sia la possibilità di avviare un nuovo processo con il debug abilitato, sia la possibilità di eseguire il debug di un processo già in esecuzione.

5.1. IntelliJ

IntelliJ offre supporto di prima classe per le applicazioni Spring e Spring Boot. Il debug è semplice come navigare nella classe con il metodo principale , fare clic con il pulsante destro del mouse sull'icona del triangolo e scegliere Debug.

Se un progetto contiene più applicazioni Spring Boot, IntelliJ fornirà una finestra dello strumento Esegui Dashboard. Questa finestra ci consente di eseguire il debug di più applicazioni Spring Boot da un'unica posizione:

Per le applicazioni che utilizzano Tomcat o altri server Web, possiamo creare una configurazione personalizzata per il debug. In Esegui > Modifica configurazioni , sono disponibili numerosi modelli per i server delle applicazioni più diffusi:

Infine, IntelliJ semplifica la connessione a qualsiasi processo in esecuzione e il debug. Finché l'applicazione è stata avviata con gli argomenti di debug appropriati , IntelliJ può connettersi ad essa, anche se si trova su un altro host.

Nella schermata Esegui / debug configurazioni , il modello remoto ci consentirà di configurare come collegarci all'applicazione già in esecuzione:

Notare che IntelliJ deve solo conoscere il nome host e la porta di debug. Per comodità, ci dice gli argomenti della riga di comando JVM corretti che dovrebbero essere usati sull'applicazione di cui vogliamo eseguire il debug.

5.2. Eclisse

Il modo più rapido per eseguire il debug di un'applicazione Spring Boot in Eclipse è fare clic con il pulsante destro del mouse sul metodo principale dalle finestre Esplora pacchetti o Struttura :

L'installazione predefinita di Eclipse non supporta Spring o Spring Boot fuori dalla scatola. Tuttavia, è disponibile un componente aggiuntivo Spring Tools in Eclipse Marketplace che fornisce supporto Spring paragonabile a IntelliJ.

In particolare, l'add-on fornisce un dashboard di avvio che ci consente di gestire più applicazioni Spring Boot da un unico posto :

L'add-on fornisce anche una configurazione di esecuzione / debug di Spring Boot che consente di personalizzare il debug di una singola applicazione Spring Boot. Questa visualizzazione personalizzata è disponibile da tutte le stesse posizioni della configurazione dell'applicazione Java standard .

Per eseguire il debug di un processo già in esecuzione, localmente o su un host remoto, possiamo utilizzare la configurazione dell'applicazione Java remota :

6. Debug con Docker

Il debug di un'applicazione Spring all'interno di un contenitore Docker potrebbe richiedere una configurazione aggiuntiva. Se il contenitore è in esecuzione localmente e non utilizza la modalità di rete host , la porta di debug non sarà accessibile all'esterno del contenitore.

Esistono diversi modi per esporre la porta di debug in Docker.

Possiamo usare –expose con il comando docker run :

docker run --expose 8000 mydockerimage

Possiamo anche aggiungere il ESPORRE direttiva al Dockerfile :

EXPOSE 8000

Oppure, se stiamo usando Docker Compose, possiamo aggiungerlo nello YAML:

expose: - "8000"

7. Conclusione

In questo articolo, abbiamo visto come abilitare il debug per qualsiasi applicazione Java.

Aggiungendo semplicemente un singolo argomento della riga di comando, possiamo facilmente eseguire il debug di qualsiasi applicazione Java.

Abbiamo anche visto che sia Maven che Gradle, così come gli IDE più popolari, hanno tutti componenti aggiuntivi specializzati per rendere ancora più semplice il debug delle applicazioni Spring e Spring Boot.