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.