Como depurar o aplicativo Spring Boot com Eclipse?


100

Minhas Spring Boot webapp está funcionando bem e gostaria de depurá-lo por meio do Eclipse.

Portanto, ao iniciar meu depurador de aplicativo Java remoto, qual porta devo escutar? E há uma configuração em meu webapp que devo definir para habilitar a depuração?


Em STS 3.9.4.RELEASE no Linux Mint 18 Sarah, tenho que ir para a perspectiva de depuração para depurar aplicativos Spring Boot.
— TimeTrap de

Respostas:


167

Por que você simplesmente não clica com o botão direito no main()método e escolhe "Debug As... Java Application"?


Não tinha pensado nisso. Estou testando um aplicativo de descanso. Abri-lo e depois acessá-lo com meu navegador com configurações diferentes.
— JeffLL

8
Há momentos em que pode ser necessário depurar o aplicativo em execução remotamente em um servidor, onde isso não se aplica.
— Cuga

Não funcionou para mim. "Editor não contém um tipo principal"
— Raj

Eu acho que você não "clicou com o botão direito no método main ()" então?
— Dave Syer de

4
Minha situação era diferente, rodar o Main diretamente não pegava alguns arquivos de configuração do spring, ou seja, bootstrap.xml, então tive que mudar para executá-lo como maven spring-boot: run. Mas o problema com isso é que, mesmo que você esteja executando esse objetivo maven do Eclipse, ele não o depurará.
— sanjay patel

91

Há a seção 19.2 em Spring Boot Reference que informa sobre como iniciar seu aplicativo com o suporte para depuração remota habilitado.

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

Depois de iniciar o aplicativo, basta adicionar a configuração do aplicativo Java remoto nas configurações Executar / Depurar, selecionar a porta / endereço que você definiu ao iniciar o aplicativo e, em seguida, você estará livre para depurar.


Isso funcionou para mim. Obrigado! O Eclipse não conseguiu depurar meu projeto de boot de primavera (continuou reclamando que a classe Main não foi encontrada).
— user6123723

4
Observe que com o Java 8 (não sei sobre outras versões) executando java -agentlib:jdwp=helpestados "A interface -Xrunjdwp mais antiga ainda pode ser usada, mas será removida em uma versão futura". Em vez disso, use-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n
— Paulo

23

Solução mais fácil:

Em vez de digitar mvn spring-boot:run, simplesmente digitemvnDebug spring-boot:run

Você ainda precisará conectar o depurador no Eclipse fazendo uma nova Configuração de Depuração para um "Aplicativo Java Remoto" na porta relevante.


3
Como você especificaria um número de porta diferente do padrão?
— Stephane

19

Não precisei configurar a depuração remota para fazer isso funcionar, usei o Maven.

  1. Certifique-se de ter o plugin Maven instalado no Eclipse.
  2. Clique em Executar> Executar configurações> Maven Build> nova configuração de inicialização :
    • Diretório base: navegue até a raiz do seu projeto
    • Objetivos: spring-boot::run.
  3. Clique em Aplicar e em Executar .

NB. Se o seu IDE tiver problemas para encontrar o código-fonte do seu projeto ao fazer a depuração linha por linha, dê uma olhada nesta resposta do SO para descobrir como anexar manualmente o código-fonte ao aplicativo de depuração.

Espero que isso ajude alguém!


Se você executar o servidor com spring-boot: run, não será capaz de pará-lo apenas pressionando o ícone vermelho na janela do console.
— Shailesh Pratapwar

Posso parar assim (pode ser necessário instalar o netstat, esqueci se criei um binário ou veio com o Cygwin ou parte do Windows agora): netstat -ano | grep "9999" - retorna 36308 id de tarefa no Windows taskkill / F / PID 36308
— armyofda12mnkeys

19

Como depurar um aplicativo Spring Boot de produção ou teste remoto

Lado do servidor

Vamos supor que você seguiu com sucesso o guia do Spring Boot sobre a configuração de seu aplicativo Spring Boot como um serviço . O artefato do seu aplicativo reside em /srv/my-app/my-app.war, acompanhado de um arquivo de configuração /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

Ao reiniciar seu aplicativo Spring Boot com sudo service my-app restart, então em seu arquivo de log localizado em /var/log/my-app.logdeve haver uma linha dizendo Listening for transport dt_socket at address: 8002.

Lado do cliente (máquina de desenvolvedor)

Abrir um túnel port-forwarding SSH para o servidor: ssh -L 8002:localhost:8002 myusername@staging.example.com. Mantenha esta sessão SSH em execução.

No Eclipse, na barra de ferramentas, selecione Executar -> Configurações de depuração -> selecione Aplicativo Java Remoto -> clique no botão Novo -> selecione como Tipo de Conexão Padrão (Conexão de Soquete) , como Host localhost e como Porta 8002 (ou o que você tiver configurada nas etapas anteriores). Clique em Aplicar e em Depurar .

O depurador Eclipse agora deve se conectar ao servidor remoto. Mudar para a perspectiva Debug deve mostrar a JVM conectada e seus encadeamentos. Os pontos de interrupção devem ser acionados assim que forem acionados remotamente.


O encaminhamento de portas e o tunelamento eram o que eu estava perdendo. Ta. Crucial se você estiver depurando em um servidor baseado na Internet, digamos na Amazon.
— PaulNUK de

14

Execute o comando abaixo onde pom.xmlestá colocado:

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

E inicie seu aplicativo Java remoto com a opção de depuração na porta5005


2
Isso falha ao esperar que um depurador se conecte Spring Boot 2.0.3.RELEASE.
— Stephane

10

A melhor solução na minha opinião é adicionar um plugin no pom.xml, e você não precisa fazer mais nada o tempo todo:

<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>

Mas então o comando mvn clean installaciona o depurador e a compilação trava. Seria legal se apenas o mvnDebug clean installcomando fizesse isso.
— Stephane

1
@Stephane, esta configuração provavelmente deve estar em um perfil específico fácil de ativar
— davidxxx

4
  • clique com o botão direito em seu projeto e escolha "Depurar como => aplicativo Java ou aplicativo Spring boot" -capture1 - insira a descrição da imagem aqui
  • Se você quiser que seu aplicativo pause em algum lugar do seu aplicativo, dê um clique duplo à esquerda você terá como esta captura 2. insira a descrição da imagem aqui
  • então, quando você iniciar seu aplicativo, use essas setas para ir em seguida. (captura 3) insira a descrição da imagem aqui

Esta é uma boa resposta à pergunta do título. No entanto, a descrição tem uma questão mais específica e diferente, que requer uma resposta diferente.
— Thor Hovden

Então, eu costumava usar MyEclispe e a opção Debug As -> Spring Boot App estava disponível e funcionou bem. Não estou usando o Eclipse Oxygen e o item de menu do Spring Boot App não está mais disponível. Preciso instalar um plugin para o eclipse para conseguir isso?
— Kachopsticks

3

Right click on the spring boot project -> debug as -> spring boot App. Coloque um ponto de depuração e invoque o aplicativo de um cliente como o carteiro


2

Consulte http://java.dzone.com/articles/how-debug-remote-java-applicat para habilitar a depuração remota. Se você estiver usando o tomcat para executar seu aplicativo, inicie o tomcat com os parâmetros de depuração remota ou você pode iniciar o tomcat com suporte JPDA usando o seguinte comando.

janelas

<tomcat bin dir>/startup.bat jpda

* nix

<tomcat bin dir>/startup.sh jpda

isso permitirá a depuração remota na porta 8000


2

Com o eclipse ou qualquer outro IDE, basta clicar com o botão direito do mouse em seu aplicativo de inicialização principal e clicar em "depurar como aplicativo java"


2

Esta pergunta já foi respondida, mas eu também tive o mesmo problema para depurar Springboot + gradle + jHipster,

Principalmente o aplicativo de inicialização Spring pode depurar com o botão direito e depurar, mas quando você usa gradle, tendo alguma configuração de parâmetro de ambiente adicional, não é possível depurar diretamente.

Para resolver isso, o Eclipse forneceu um recurso adicional como aplicativo Java remoto

usando esses recursos, você pode depurar seu aplicativo.

Siga a etapa abaixo:

execute seu aplicativo Gradle com o ./gradlew bootRun --debug-jvmcomando

Agora vá para eclipse -> clique com o botão direito do mouse em projeto e configuração de depuração -> Aplicativo Java Remoto.

adicione seu host e porta como localhost e porta como 5005 (padrão para depuração gradle, você pode alterá-lo)

Consulte para obter mais detalhes e etapas.


0

Clique com o botão direito do mouse no arquivo de classe principal do Spring Boot Applications -> selecione as opções Debug As -> Selecione o aplicativo Java

insira a descrição da imagem aqui Agora você pode usar pontos de interrupção para depurar o aplicativo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.