Jak debugować aplikację Spring Boot za pomocą Eclipse?

100

Moja aplikacja internetowa Spring Bootdziała dobrze i chciałbym ją debugować za pomocą Eclipse.

Więc kiedy uruchamiam zdalny debugger aplikacji Java, którego portu powinienem słuchać? Czy jest jakieś ustawienie w mojej aplikacji internetowej, które muszę ustawić, aby włączyć debugowanie?

JeffLL
źródło
W STS 3.9.4.RELEASE na Linux Mint 18 Sarah muszę przejść do perspektywy debugowania, aby debugować aplikacje Spring Boot.
TimeTrap,

Odpowiedzi:

167

Dlaczego po prostu nie klikniesz main()metody prawym przyciskiem myszy i nie wybierzesz "Debug As... Java Application"?

Dave Syer
źródło
Nie pomyślałem o tym. Testuję aplikację do odpoczynku. Uruchamiam go, a następnie wciskam w mojej przeglądarce z różnymi konfiguracjami.
JeffLL,
8
Są chwile, kiedy może zajść potrzeba debugowania aplikacji działającej zdalnie na serwerze, gdzie to nie ma zastosowania.
Cuga
Dla mnie to nie zadziałało. „Edytor nie zawiera głównego typu”
Raj
Wydaje mi się, że wtedy nie „kliknąłeś prawym przyciskiem myszy metody main ()”?
Dave Syer
4
Moja sytuacja była jednak inna, uruchomienie Main bezpośrednio nie pobrało kilku plików konfiguracyjnych, np. Bootstrap.xml, więc musiałem przełączyć się na uruchamianie go jako maven spring-boot: run. Ale problem polega na tym, że nawet jeśli wykonujesz ten cel maven z zaćmienia, nie będzie go debugować.
sanjay patel
91

W Spring Boot Reference znajduje się sekcja 19.2, która mówi o uruchamianiu aplikacji z włączoną obsługą zdalnego debugowania.

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

Po uruchomieniu aplikacji po prostu dodaj tę konfigurację zdalnej aplikacji Java w konfiguracjach uruchamiania / debugowania, wybierz port / adres zdefiniowany podczas uruchamiania aplikacji, a następnie możesz debugować.

masster
źródło
To zadziałało dla mnie. Dzięki! Eclipse nie mógł debugować mojego wiosennego projektu rozruchowego (nadal narzekałem, że nie można znaleźć klasy głównej).
user6123723
4
Zauważ, że w Javie 8 (nie wiem o innych wersjach) działa java -agentlib:jdwp=helpstan „Starszego interfejsu -Xrunjdwp można nadal używać, ale zostanie on usunięty w przyszłej wersji”. Zamiast tego użyj-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n
Paul
23

Łatwiejsze rozwiązanie:

Zamiast pisać mvn spring-boot:run, po prostu piszmvnDebug spring-boot:run

Nadal będziesz musiał podłączyć debugger w Eclipse, tworząc nową konfigurację debugowania dla „zdalnej aplikacji Java” na odpowiednim porcie.

Duran Wesley Harris
źródło
3
W jaki sposób określisz numer portu inny niż domyślny?
Stephane
19

Nie musiałem konfigurować zdalnego debugowania, aby to działało, użyłem Mavena.

  1. Upewnij się, że masz zainstalowaną wtyczkę Maven w Eclipse.
  2. Kliknij Uruchom> Uruchom konfiguracje> Maven Build> nowa konfiguracja uruchamiania :
    • Katalog podstawowy: przejdź do katalogu głównego projektu
    • Cele: spring-boot::run.
  3. Kliknij Zastosuj, a następnie kliknij Uruchom .

NB. Jeśli Twoje IDE ma problemy ze znalezieniem kodu źródłowego projektu podczas debugowania wiersz po wierszu, zapoznaj się z tą odpowiedzią SO, aby dowiedzieć się, jak ręcznie dołączyć kod źródłowy do aplikacji debugowania.

Mam nadzieję, że to komuś pomoże!

Dawngerpony
źródło
Jeśli uruchomisz serwer za pomocą spring-boot: run, nie będziesz w stanie go zatrzymać, naciskając tylko czerwoną ikonę w oknie konsoli.
Shailesh Pratapwar
Mogę to zatrzymać w ten sposób (może być konieczne zainstalowanie netstat, zapomnę, czy uruchomiłem plik binarny lub przyszedłem z Cygwinem lub częścią systemu Windows): netstat -ano | grep "9999" - zwraca 36308 identyfikator zadania w systemie Windows taskkill / F / PID 36308
armyofda12mnkeys
19

Jak debugować zdalną tymczasową lub produkcyjną aplikację Spring Boot

Po stronie serwera

Załóżmy, że pomyślnie wykonałeś przewodnik Spring Boot dotyczący konfigurowania aplikacji Spring Boot jako usługi . Twój artefakt aplikacji znajduje się w programie /srv/my-app/my-app.warwraz z plikiem konfiguracyjnym /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

Po ponownym uruchomieniu aplikacji Spring Boot za pomocą sudo service my-app restart, w jej pliku dziennika znajdującym się pod adresem /var/log/my-app.logpowinna znajdować się linia mówiąca Listening for transport dt_socket at address: 8002.

Po stronie klienta (maszyna deweloperska)

Otwieranie portu SSH przekazywania tunel do serwera: ssh -L 8002:localhost:8002 [email protected]. Nie wyłączaj tej sesji SSH.

W Eclipse, z paska narzędzi, wybierz Uruchom -> Konfiguracje debugowania -> wybierz Zdalna aplikacja Java -> kliknij przycisk Nowy -> wybierz jako Standard typu połączenia (podłączenie do gniazda) , jako Host localhost i jako Port 8002 (lub cokolwiek masz skonfigurowane w poprzednich krokach). Kliknij Zastosuj, a następnie Debuguj .

Debugger Eclipse powinien teraz połączyć się ze zdalnym serwerem. Przełączenie do perspektywy debugowania powinno pokazać połączoną maszynę JVM i jej wątki. Punkty przerwania powinny odpalać, gdy tylko zostaną zdalnie uruchomione.

Abdull
źródło
Przekierowanie portów i tunelowanie były tym, czego mi brakowało. Ta. Kluczowe znaczenie, jeśli debugujesz na serwerze internetowym, na przykład na Amazon.
PaulNUK,
14

Uruchom poniższe polecenie, w którym pom.xmljest umieszczone:

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

I uruchom zdalną aplikację java z opcją debugowania na porcie5005

Arpit Aggarwal
źródło
2
To nie pozwala czekać na dołączenie debugera Spring Boot 2.0.3.RELEASE.
Stephane
10

Moim zdaniem najlepszym rozwiązaniem jest dodanie wtyczki do pom.xml i nie musisz cały czas robić nic więcej:

<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>
krmanish007
źródło
Ale potem polecenie mvn clean installwyzwala debuger i kompilacja zawiesza się. Byłoby fajnie, gdyby mvnDebug clean installzrobiła to tylko komenda.
Stephane,
1
@Stephane, ta konfiguracja powinna prawdopodobnie znajdować się w określonym profilu łatwym do włączenia
davidxxx
4
  • kliknij prawym przyciskiem myszy swój projekt i wybierz „Debuguj jako => aplikacja Java lub aplikacja rozruchowa Spring” -capture1 - wprowadź opis obrazu tutaj
  • Jeśli chcesz, aby aplikacja zatrzymała się gdzieś w aplikacji, kliknij dwukrotnie po lewej stronie, będziesz miał takie przechwytywanie 2. wprowadź opis obrazu tutaj
  • następnie po uruchomieniu aplikacji użyj tych strzałek, aby przejść dalej. (zdjęcie 3) wprowadź opis obrazu tutaj
Abdelwahid Oubaalla
źródło
To dobra odpowiedź na tytułowe pytanie. Jednak opis ma bardziej szczegółowe i inne pytanie, które wymaga innej odpowiedzi.
Thor Hovden,
Więc użyłem MyEclispe, a opcja Debug As -> Spring Boot App była dostępna i działała dobrze. Nie używam Eclipse Oxygen, a pozycja menu aplikacji Spring Boot nie jest już dostępna. Czy muszę zainstalować wtyczkę do Eclipse, aby to uzyskać?
Kachopsticks
3

Right click on the spring boot project -> debug as -> spring boot App. Umieść punkt debugera i wywołaj aplikację z klienta, takiego jak listonosz

Tadele Ayelegn
źródło
2

Zobacz http://java.dzone.com/articles/how-debug-remote-java-applicat aby włączyć zdalne debugowanie. Jeśli używasz tomcat do uruchamiania aplikacji, uruchom tomcat z parametrami zdalnego debugowania lub możesz uruchomić tomcat z obsługą JPDA za pomocą następującego polecenia.

Windows

<tomcat bin dir>/startup.bat jpda

*nic

<tomcat bin dir>/startup.sh jpda

umożliwi to zdalne debugowanie na porcie 8000

Sangram Jadhav
źródło
2

W przypadku eclipse lub dowolnego innego środowiska IDE wystarczy kliknąć prawym przyciskiem myszy aplikację rozruchową głównego źródła i kliknąć opcję „debuguj jako aplikację java”

adia
źródło
2

Na to pytanie już udzielono odpowiedzi, ale mam też ten sam problem z debugowaniem Springboot + gradle + jHipster,

Przeważnie aplikacja Spring boot może debugować prawym przyciskiem myszy i debugować, ale kiedy używasz gradle, mając dodatkowe ustawienia parametrów środowiska, nie jest możliwe debugowanie bezpośrednio.

Aby rozwiązać ten problem, Eclipse dostarczyło jedną dodatkową funkcję jako zdalną aplikację Java

Korzystając z tych funkcji, możesz debugować swoją aplikację.

Postępuj zgodnie z poniższym krokiem:

uruchom aplikację gradle za pomocą ./gradlew bootRun --debug-jvmpolecenia

Teraz przejdź do eclipse -> kliknij prawym przyciskiem myszy projekt i konfiguracja debugowania -> Remote Java Application.

dodaj hosta i port jako localhost i port jako 5005 (domyślny dla debugowania gradle, możesz to zmienić)

Zobacz więcej szczegółów i krok.

bharatpatel
źródło
0

Kliknij prawym przyciskiem myszy główny plik klasy aplikacji Spring Boot -> wybierz opcje Debuguj jako -> Wybierz aplikację Java

wprowadź opis obrazu tutaj Teraz możesz używać punktów przerwania do debugowania aplikacji.

Bishal Jaiswal
źródło