Làm thế nào để gỡ lỗi ứng dụng Spring Boot với Eclipse?


100

Spring BootỨng dụng web của tôi đang chạy tốt và tôi muốn gỡ lỗi nó thông qua Eclipse.

Vì vậy, khi khởi chạy trình gỡ lỗi Ứng dụng Java Từ xa, tôi nên nghe cổng nào? Và có cài đặt nào trên ứng dụng web của tôi mà tôi phải đặt để bật gỡ lỗi không?


Trong STS 3.9.4.RELEASE trên Linux Mint 18 Sarah, tôi phải đi vào quan điểm gỡ lỗi để gỡ lỗi các ứng dụng Spring Boot.
TimeTrap

Câu trả lời:


167

Tại sao bạn không chỉ cần nhấp chuột phải vào main()phương thức và chọn "Debug As... Java Application"?


Tôi đã không nghĩ về điều đó. Tôi đang thử nghiệm một ứng dụng nghỉ ngơi. Khởi chạy nó, sau đó đánh nó bằng trình duyệt của tôi với các cấu hình khác nhau.
JeffLL

8
Đôi khi người ta có thể cần gỡ lỗi ứng dụng đang chạy từ xa trên máy chủ, nơi điều này sẽ không áp dụng.
Cuga

Nó không làm việc cho tôi. "Trình chỉnh sửa không chứa loại chính"
Raj

Tôi đoán bạn đã không "nhấp chuột phải vào phương thức main ()" sau đó?
Dave Syer

4
Tình huống của tôi là một mạng khác, chạy Main trực tiếp không chọn được vài tệp cấu hình mùa xuân tức là bootstrap.xml, sau đó tôi phải chuyển sang chạy nó như maven spring-boot: run. Nhưng vấn đề với nó là nếu ngay cả khi bạn đang chạy mục tiêu maven này từ nhật thực nó sẽ không gỡ lỗi nó.
sanjay patel

91

phần 19.2 trong Tham chiếu khởi động mùa xuân cho bạn biết về cách khởi động ứng dụng của mình với hỗ trợ gỡ lỗi từ xa được bật.

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

Sau khi bạn khởi động ứng dụng của mình, chỉ cần thêm cấu hình Ứng dụng Java Từ xa đó trong cấu hình Chạy / Gỡ lỗi, chọn cổng / địa chỉ bạn đã xác định khi khởi động ứng dụng và sau đó bạn có thể tự do gỡ lỗi.


Điều này đã làm việc cho tôi. Cảm ơn! Eclipse không thể gỡ lỗi dự án khởi động mùa xuân của tôi (Tôi đã phàn nàn rằng không thể tìm thấy lớp Chính).
user6123723

4
Lưu ý rằng với Java 8 (tôi không biết về các phiên bản khác) đang chạy java -agentlib:jdwp=helptrạng thái "Giao diện -Xrunjdwp cũ hơn vẫn có thể được sử dụng, nhưng sẽ bị xóa trong bản phát hành trong tương lai". Thay vào đó, hãy sử dụng-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n
Paul

23

Giải pháp dễ dàng hơn:

Thay vì nhập mvn spring-boot:run, chỉ cần gõmvnDebug spring-boot:run

Bạn vẫn cần đính kèm trình gỡ lỗi trong Eclipse bằng cách tạo Cấu hình gỡ lỗi mới cho "Ứng dụng Java từ xa" trên cổng liên quan.


3
Sau đó, bạn sẽ chỉ định một số cổng khác với số mặc định như thế nào?
Stephane

19

Tôi không cần thiết lập gỡ lỗi từ xa để làm việc này, tôi đã sử dụng Maven.

  1. Đảm bảo bạn đã cài đặt plugin Maven vào Eclipse.
  2. Nhấp vào Chạy> Chạy Cấu hình> Bản dựng Maven> cấu hình khởi chạy mới :
    • Thư mục cơ sở: duyệt đến thư mục gốc của dự án của bạn
    • Mục tiêu: spring-boot::run.
  3. Nhấp vào Áp dụng rồi nhấp vào Chạy .

NB. Nếu IDE của bạn gặp sự cố khi tìm mã nguồn của dự án khi thực hiện gỡ lỗi từng dòng, hãy xem câu trả lời SO này để tìm hiểu cách đính kèm mã nguồn của bạn vào ứng dụng gỡ lỗi theo cách thủ công.

Hy vọng điều này sẽ giúp ai đó!


Nếu bạn chạy máy chủ với spring-boot: run, bạn sẽ không thể dừng nó bằng cách nhấn biểu tượng Màu đỏ trong cửa sổ bảng điều khiển.
Shailesh Pratapwar

Tôi có thể dừng nó lại như vậy (có thể cần netstat intalled, tôi quên nếu tôi sử dụng hệ nhị phân hoặc sử dụng Cygwin, hoặc một phần của windows bây giờ): netstat -ano | grep "9999" - trả lại id nhiệm vụ 36308 trong Windows taskkill / F / PID 36308
armyofda12mnkeys

19

Cách gỡ lỗi ứng dụng Spring Boot dàn dựng hoặc sản xuất từ ​​xa

Phía máy chủ

Giả sử bạn đã làm theo thành công hướng dẫn của Spring Boot về cách thiết lập ứng dụng Spring Boot của bạn như một dịch vụ . Phần mềm ứng dụng của bạn nằm trong /srv/my-app/my-app.war, kèm theo tệp cấu hình /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

Khi bạn khởi động lại ứng dụng Spring Boot của mình bằng sudo service my-app restart, thì trong tệp nhật ký của nó nằm tại /var/log/my-app.logsẽ có một dòng cho biết Listening for transport dt_socket at address: 8002.

Phía máy khách (máy nhà phát triển)

Mở một SSH tunnel port-forwarding đến máy chủ: ssh -L 8002:localhost:8002 myusername@staging.example.com. Giữ cho phiên SSH này chạy.

Trong Eclipse, từ thanh công cụ, chọn Run -> Debug Configurations -> chọn Remote Java Application -> nhấp vào nút New -> chọn là Connection Type Standard (Socket Attach) , như Host localhost và Port 8002 (hoặc bất kỳ thứ gì bạn có đã cấu hình ở các bước trước). Nhấp vào Áp dụng và sau đó Gỡ lỗi .

Trình gỡ lỗi Eclipse bây giờ sẽ kết nối với máy chủ từ xa. Chuyển sang phối cảnh Gỡ lỗi sẽ hiển thị JVM được kết nối và các luồng của nó. Các điểm ngắt sẽ kích hoạt ngay sau khi chúng được kích hoạt từ xa.


Chuyển tiếp cổng và đường hầm là phần tôi đã thiếu. Ta. Điều quan trọng nếu bạn đang gỡ lỗi cho một máy chủ dựa trên internet, hãy nói trên Amazon.
PaulNUK

14

Chạy lệnh dưới đây nơi pom.xmlđược đặt:

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

Và khởi động ứng dụng java từ xa của bạn với tùy chọn gỡ lỗi trên cổng5005


2
Điều này không thể đợi trình gỡ lỗi đính kèm vào Spring Boot 2.0.3.RELEASE.
Stephane

10

Giải pháp tốt nhất theo ý kiến ​​của tôi là thêm một plugin vào pom.xml và bạn không cần phải làm bất cứ điều gì khác mọi lúc:

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

Nhưng sau đó lệnh mvn clean installkích hoạt trình gỡ lỗi và bản dựng bị treo. Sẽ thật tuyệt nếu chỉ mvnDebug clean installlệnh làm như vậy.
Stephane

1
@Stephane, cấu hình này có lẽ phải ở trong một cấu hình cụ thể dễ dàng bật
davidxxx

4
  • nhấp chuột phải vào dự án của bạn và chọn "Debug As => Java application or Spring boot App" -capture1 - nhập mô tả hình ảnh ở đây
  • Nếu bạn muốn ứng dụng của mình tạm dừng ở đâu đó trong ứng dụng, hãy nhấp đúp vào bên trái, bạn sẽ có như hình chụp 2. nhập mô tả hình ảnh ở đây
  • sau đó khi bạn khởi động ứng dụng của mình, hãy sử dụng các mũi tên đó để đi tiếp. (chụp 3) nhập mô tả hình ảnh ở đây

Đây là một câu trả lời tốt cho câu hỏi tiêu đề. Tuy nhiên, mô tả có một câu hỏi cụ thể hơn và khác, yêu cầu một câu trả lời khác.
Thor Hovden

Vì vậy, tôi đã sử dụng MyEclispe và tùy chọn Debug As -> Spring Boot App đã có sẵn và hoạt động tốt. Tôi không sử dụng Eclipse Oxygen và mục menu Spring Boot App không còn nữa. Tôi có cần cài đặt plugin cho eclipse để có được điều này không?
Kachopsticks

3

Right click on the spring boot project -> debug as -> spring boot App. Đặt một điểm gỡ lỗi và gọi ứng dụng từ một khách hàng như người đưa thư


2

Vui lòng xem http://java.dzone.com/articles/how-debug-remote-java-applicat để kích hoạt gỡ lỗi từ xa. Nếu bạn đang sử dụng tomcat để chạy ứng dụng của mình, hãy khởi động tomcat với các tham số gỡ lỗi từ xa hoặc bạn có thể khởi động tomcat với hỗ trợ JPDA bằng cách sử dụng lệnh sau.

các cửa sổ

<tomcat bin dir>/startup.bat jpda

* nix

<tomcat bin dir>/startup.sh jpda

điều này sẽ cho phép gỡ lỗi từ xa trên cổng 8000


2

Với eclipse hoặc bất kỳ IDE nào khác, chỉ cần nhấp chuột phải vào ứng dụng khởi động mùa xuân chính của bạn và nhấp vào "gỡ lỗi dưới dạng ứng dụng java"


2

Câu hỏi này đã được trả lời, nhưng tôi cũng gặp phải vấn đề tương tự khi gỡ lỗi Springboot + gradle + jHipster,

Hầu hết ứng dụng khởi động Spring có thể gỡ lỗi bằng cách nhấp chuột phải và gỡ lỗi, nhưng khi bạn sử dụng gradle, có một số thiết lập tham số môi trường bổ sung thì không thể gỡ lỗi trực tiếp.

Để giải quyết vấn đề này, Eclipse đã cung cấp một tính năng bổ sung là Ứng dụng Java từ xa

bằng cách sử dụng các tính năng này, bạn có thể gỡ lỗi ứng dụng của mình.

Làm theo bước dưới đây:

chạy ứng dụng gradle của bạn bằng ./gradlew bootRun --debug-jvmlệnh

Bây giờ vào eclipse -> nhấp chuột phải vào dự án và Gỡ lỗi cấu hình -> Ứng dụng Java từ xa.

thêm máy chủ và cổng của bạn làm localhost và cổng là 5005 (mặc định cho gỡ lỗi gradle, bạn có thể thay đổi nó)

Tham khảo để biết thêm chi tiết và bước.


0

Nhấp chuột phải vào tệp lớp chính của Spring Boot Applications -> chọn tùy chọn Debug As -> Chọn Java Application

nhập mô tả hình ảnh ở đây Bây giờ bạn có thể sử dụng các điểm ngắt để gỡ lỗi ứng dụng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.