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?


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


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


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.


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!


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 myusername@staging.example.com. 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.


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


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>

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

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


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


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”


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.