Depurando aplicativos Spring

Depurando aplicativos Spring

1. Introdução

A depuração é uma das ferramentas mais importantes para escrever software.

Neste tutorial, revisaremos algumas das maneiras pelas quais podemos depurar aplicativos Spring.

Também veremos como Spring Boot, servidores de aplicativos tradicionais e IDEs simplificam isso.

2. Java Debug Args

Primeiro, vamos dar uma olhada no que Java nos oferece fora da caixa.

By default, the JVM does not enable debugging. Isso ocorre porque a depuração cria uma sobrecarga adicional dentro da JVM. Também pode ser uma preocupação de segurança para aplicativos acessíveis ao público.

Portanto,debugging should only be performed during developmente nunca em sistemas de produção.

Antes de podermos conectar um depurador, devemos primeiro configurar a JVM para permitir a depuração. Fazemos isso configurando um argumento de linha de comandos para a JVM:

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

Vamos analisar o que cada um desses valores significa:

-agentlib: jdwp

Ative o agente JDWP (Java Debug Wire Protocol) dentro da JVM. This is the main command line argument that enables debugging.

transport = dt_socket

Use um soquete de rede para conexões de depuração. Outras opções incluem soquetes Unix e memória compartilhada.

server = y

Escute as conexões de depuração recebidas. Quando definido comon, o processo tentará se conectar a um depurador em vez de esperar pelas conexões de entrada. Argumentos adicionais são necessários quando definido comon.

suspender = n

Não espere por uma conexão de depuração na inicialização. O aplicativo será iniciado e executado normalmente até que um depurador seja anexado. Quando definido comoy, o processo não será iniciado até que um depurador seja anexado.

endereço = 8000

A porta de rede em que a JVM escutará as conexões de depuração.

Os valores acima são padrão e funcionarão na maioria dos casos de uso e sistemas operacionais. OJPDA connection guide cobre todos os valores possíveis com mais detalhes.

3. Aplicativos Spring Boot

Aplicativos Spring Bootcan be started several ways. A maneira mais simples é a partir da linha de comando usando o comandojava com a opção-jar.

Para habilitar a depuração, simplesmente adicionaríamos o argumento debug usando a opção-D:

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

Com o Maven, podemos usar a metarun fornecida para iniciar nosso aplicativo com a depuração habilitada:

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

Da mesma forma, com o Gradle, podemos usar a tarefabootRun. Primeiro, devemos atualizar o arquivobuild.gradle para garantir que o Gradle passe os argumentos da linha de comando para a JVM:

bootRun {
   systemProperties = System.properties
}

Agora podemos executar a tarefabootRun:

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

4. Servidores de aplicativos

Embora o Spring Boot tenha se tornado muito popular nos últimos anos, oapplication servers tradicional ainda prevalece em arquiteturas de software modernas. Nesta seção, veremos como habilitar a depuração para alguns dos servidores de aplicativos mais populares.

A maioria dos servidores de aplicativos fornece um script para iniciar e parar aplicativos. Habilitar a depuração normalmente é apenas uma questão de adicionar argumentos adicionais a esse script e / ou definir variáveis ​​de ambiente adicionais.

4.1. Tomcat

O script de inicialização deTomcat é denominadocatalina.sh (catalina.bat no Windows). Para iniciar um servidor Tomcat com a depuração habilitada, podemos acrescentarjpda aos argumentos:

catalina.sh jpda start

Os argumentos de depuração padrão usarão um soquete de rede ouvindo na porta 8000 comsuspend=n. Isso pode ser alterado definindo uma ou mais das seguintes variáveis ​​de ambiente:JPDA_TRANSPORT,JPDA_ADDRESS eJPDA_SUSPEND.

Também podemos obter controle total dos argumentos de depuração definindoJPDA_OPTS. Quando essa variável é configurada, ela tem precedência sobre as outras variáveis ​​JPDA. Portanto, deve ser um argumento de depuração completo para a JVM.

4.2. Vôo selvagem

O script de inicialização paraWildfly éstand-alone.sh. Para iniciar um servidor Wildfly com a depuração habilitada, podemos adicionar–debug.

O modo de depuração padrão usa um ouvinte de rede na porta 8787 comsuspend=n. Podemos substituir a porta especificando-a após o argumento–debug.

Para obter mais controle sobre o argumento de depuração, podemos apenas adicionar os argumentos de depuração completos à variável de ambienteJAVA_OPTS.

4.3. Weblogic

O script de inicialização do Weblogic éstartWeblogic.sh. Para iniciar um servidor Weblogic com a depuração habilitada, podemos definir a variável de ambientedebugFlag paratrue.

O modo de depuração padrão usa um ouvinte de rede na porta 8453 comsuspend=n. Podemos substituir a porta definindo a variável de ambienteDEBUG_PORT.

Para obter mais controle sobre o argumento de depuração, podemos apenas adicionar os argumentos de depuração completos à variável de ambienteJAVA_OPTIONS.

As últimas versões do Weblogic também fornecem um plug-in Maven para iniciar e parar servidores. This plugin will honor the same environment variables as the startup script.

4.4. Peixe de vidro

O script de inicialização do Glassfish éasadmin. Para iniciar um servidor Glassfish com a depuração habilitada, temos que usar–debug:

asadmin start-domain --debug

O modo de depuração padrão usa um ouvinte de rede na porta 9009 comsuspend=n.

4.5. Jetty

O servidor de aplicativos Jetty não vem com um script de inicialização. Em vez disso, os servidores Jetty são iniciados usando o comandojava.

Portanto, ativar a depuração é tão simples quanto adicionar os argumentos de linha de comando padrão da JVM.

5. Depurando de um IDE

Agora que vimos como habilitar a depuração em vários tipos de aplicativos, vejamos como conectar um depurador.

Todo IDE moderno oferece suporte à depuração. Isso inclui a capacidade de iniciar um novo processo com a depuração ativada, bem como a capacidade de depurar um processo já em execução.

5.1. IntelliJ

IntelliJ oferece suporte de primeira classe para aplicativos Spring e Spring Boot. A depuração é tão simples quanto navegar até a classe com o métodomain, clicar com o botão direito do mouse no ícone de triângulo e escolher Depurar.

image

Se um projeto contiver vários aplicativos Spring Boot, o IntelliJ fornecerá uma janela da ferramenta Run Dashboard. Essa janela nos permite depurar vários aplicativos Spring Boot em um único local:

image

Para aplicativos que usam o Tomcat ou outros servidores da web, podemos criar uma configuração personalizada para depuração. EmRun>Edit Configurations, há uma série de modelos para os servidores de aplicativos mais populares:

image

Finalmente, o IntelliJ facilita muito a conexão com qualquer processo em execução e a depuração. As long as the application was started with the proper debug arguments, IntelliJ pode se conectar a ele, mesmo se estiver em outro host.

Na telaRun/Debug Configurations, o modeloRemote nos permitirá configurar como anexar ao aplicativo já em execução:

image

Observe que o IntelliJ precisa apenas conhecer o nome do host e a porta de depuração. Por conveniência, ele nos informa os argumentos apropriados da linha de comando da JVM que devem ser usados ​​no aplicativo que queremos depurar.

5.2. Eclipse

A maneira mais rápida de depurar um aplicativo Spring Boot no Eclipse é clicar com o botão direito do mouse no método principal nas janelasPackage Explorer ouOutline:

image

A instalação padrão do Eclipse não suporta Spring ou Spring Boot fora da caixa. No entanto, há umSpring Tools add-on disponível no Eclipse Marketplace que fornece suporte Spring comparável ao IntelliJ.

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

image

O add-on também fornece uma configuração de execução / depuraçãoSpring Boot que permite personalizar a depuração de um único aplicativo Spring Boot. Essa visualização personalizada está disponível em todos os mesmos locais da configuração padrãoJava Application.

Para depurar um processo já em execução, localmente ou em um host remoto, podemos usar a configuraçãoRemote Java Application:

image

6. Depuração com Docker

A depuração de umSpring application inside a Docker container pode exigir configuração adicional. If the container is running locally and is not using host network mode, então a porta de depuração não estará acessível fora do contêiner.

Existem várias maneiras de expor a porta de depuração no Docker.

Podemos usar–expose com o comandodocker run:

docker run --expose 8000 mydockerimage

Também podemos adicionar a diretivaEXPOSE aoDockerfile:

EXPOSE 8000

Ou, se estivermos usando o Docker Compose, podemos adicioná-lo ao YAML:

expose:
 - "8000"

7. Conclusão

Neste artigo, vimos como habilitar a depuração para qualquer aplicativo Java.

Simplesmente adicionando um único argumento de linha de comando, podemos depurar facilmente qualquer aplicativo Java.

Também vimos que o Maven e o Gradle, assim como os IDEs mais populares, têm complementos especializados para facilitar ainda mais a depuração dos aplicativos Spring e Spring Boot.