วิธีการดีบักแอปพลิเคชัน Spring Boot ด้วย Eclipse


103

Spring Bootเว็บแอปของฉันทำงานได้ดีและฉันต้องการดีบักผ่าน Eclipse

ดังนั้นเมื่อเปิดตัวดีบักเกอร์ Remote Java Application ฉันควรฟังพอร์ตใด และมีการตั้งค่าบนเว็บแอปของฉันหรือไม่ที่ฉันต้องตั้งค่าเพื่อเปิดใช้งานการดีบัก


ใน STS 3.9.4 RELEASE บน Linux Mint 18 Sarah ฉันต้องเข้าสู่มุมมองการดีบักเพื่อดีบักแอปพลิเคชัน Spring Boot
TimeTrap

คำตอบ:


168

ทำไมคุณไม่คลิกขวาที่main()วิธีการและเลือก"Debug As... Java Application"?


ไม่ได้คิดอย่างนั้น ฉันกำลังทดสอบแอปที่เหลือ เปิดใช้งานแล้วกดปุ่มด้วยเบราว์เซอร์ของฉันด้วยการกำหนดค่าต่างๆ
JeffLL

9
มีหลายครั้งที่อาจต้องดีบักแอปพลิเคชันที่ทำงานจากระยะไกลบนเซิร์ฟเวอร์ซึ่งจะไม่มีผลบังคับใช้
Cuga

มันไม่ได้ผลสำหรับฉัน "บรรณาธิการไม่มีประเภทหลัก"
Raj

ฉันเดาว่าคุณไม่ได้ "คลิกขวาที่ main () method" แล้ว?
Dave Syer

4
สถานการณ์ของฉันเป็นเพียงความแตกต่างการรัน Main โดยตรงไม่ได้รับไฟล์การกำหนดค่าสปริงเพียงไม่กี่ไฟล์เช่น bootstrap.xml จากนั้นฉันต้องเปลี่ยนไปใช้งานเป็น maven spring-boot: run แต่ปัญหาก็คือแม้ว่าคุณจะเรียกใช้เป้าหมาย maven นี้จากคราสมันจะไม่ดีบัก
sanjay patel

93

มีส่วนที่19.2ใน Spring Boot Referenceที่บอกคุณเกี่ยวกับการเริ่มแอปพลิเคชันของคุณโดยเปิดใช้งานการสนับสนุนการดีบักระยะไกล

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

หลังจากที่คุณเริ่มแอปพลิเคชันของคุณเพียงแค่เพิ่มการกำหนดค่า Remote Java Applicationในการกำหนดค่า Run / Debug เลือกพอร์ต / ที่อยู่ที่คุณกำหนดไว้เมื่อเริ่มต้นแอปจากนั้นคุณมีอิสระในการดีบัก


สิ่งนี้ได้ผลสำหรับฉัน ขอบคุณ! Eclipse ไม่สามารถดีบักโปรเจ็กต์สปริงบูตของฉัน (เอาแต่บ่นว่าไม่พบคลาสหลัก)
user6123723

4
โปรดทราบว่าเมื่อใช้ Java 8 (ฉันไม่รู้เกี่ยวกับเวอร์ชันอื่น) ที่ใช้งานjava -agentlib:jdwp=helpสถานะ "อินเทอร์เฟซ -Xrunjdwp รุ่นเก่ายังสามารถใช้งานได้ แต่จะถูกลบออกในอนาคต" แทนที่จะใช้-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n
พอล

26

วิธีแก้ปัญหาที่ง่ายกว่า:

แทนที่จะพิมพ์mvn spring-boot:runเพียงแค่พิมพ์mvnDebug spring-boot:run

คุณยังคงต้องแนบดีบักเกอร์ใน Eclipse โดยสร้าง Debug Configuration ใหม่สำหรับ "Remote Java Application" บนพอร์ตที่เกี่ยวข้อง


3
คุณจะระบุหมายเลขพอร์ตอื่นนอกเหนือจากค่าเริ่มต้นได้อย่างไร?
Stephane

19

ฉันไม่จำเป็นต้องตั้งค่าการดีบักระยะไกลเพื่อให้มันใช้งานได้ฉันใช้ Maven

  1. ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งปลั๊กอิน Maven ใน Eclipse
  2. คลิกRun> Run Configurations> Maven Build> new launch configuration :
    • ไดเร็กทอรีฐาน: เรียกดูรูทของโปรเจ็กต์ของคุณ
    • เป้าหมาย: spring-boot::run.
  3. คลิกApplyแล้วคลิกเรียกใช้

NB. หาก IDE ของคุณมีปัญหาในการค้นหาซอร์สโค้ดของโปรเจ็กต์ของคุณเมื่อทำการดีบักแบบทีละบรรทัดให้ดูที่คำตอบ SO นี้เพื่อค้นหาวิธีแนบซอร์สโค้ดของคุณด้วยตนเองกับแอปพลิเคชันการดีบัก

หวังว่านี่จะช่วยใครสักคน!


หากคุณเรียกใช้เซิร์ฟเวอร์ด้วย spring-boot: run คุณจะไม่สามารถหยุดได้เพียงแค่กดไอคอน Red ในหน้าต่างคอนโซล
Shailesh Pratapwar

ฉันสามารถหยุดมันได้ (อาจต้องการ netstat intalled ฉันลืมไปว่าฉัน dled binary หรือมาพร้อมกับ Cygwin หรือเป็นส่วนหนึ่งของ windows ตอนนี้): netstat -ano grep "9999" - ส่งคืนรหัสงาน 36308 ใน Windows taskkill / F / PID 36308
armyofda12mnkeys

19

วิธีการดีบักแอปพลิเคชัน Spring Boot ระยะไกลหรือการผลิต

ฝั่งเซิร์ฟเวอร์

สมมติว่าคุณทำตามคำแนะนำของ Spring Boot ในการตั้งค่าแอปพลิเคชัน Spring Boot เป็นบริการเรียบร้อยแล้ว อาร์ติแฟกต์แอปพลิเคชันของคุณอยู่/srv/my-app/my-app.warพร้อมกับไฟล์การกำหนดค่า/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

เมื่อคุณเริ่มต้นแอพลิเคชันฤดูใบไม้ผลิ Boot ของคุณด้วยsudo service my-app restartแล้วในแฟ้มบันทึกตั้งอยู่ที่ควรเป็นสายที่ว่า/var/log/my-app.logListening for transport dt_socket at address: 8002

ฝั่งไคลเอ็นต์ (เครื่องผู้พัฒนา)

เปิดอุโมงค์ SSH ssh -L 8002:localhost:8002 myusername@staging.example.comพอร์ตการส่งต่อไปยังเซิร์ฟเวอร์: ให้เซสชัน SSH ทำงานต่อไป

ใน Eclipse จากแถบเครื่องมือเลือกRun -> Debug Configurations -> เลือกRemote Java Application -> คลิกปุ่มNew -> เลือกเป็น Connection Type Standard (Socket Attach)เป็น Host localhostและเป็น Port 8002 (หรืออะไรก็ได้ที่คุณมี กำหนดค่าในขั้นตอนก่อนหน้านี้) คลิกสมัครแล้วตรวจแก้จุดบกพร่อง

ตอนนี้ดีบักเกอร์ Eclipse ควรเชื่อมต่อกับรีโมตเซิร์ฟเวอร์ การเปลี่ยนไปใช้มุมมองการแก้ปัญหาควรแสดง JVM ที่เชื่อมต่อและเธรด เบรกพอยต์ควรเริ่มทำงานทันทีที่ถูกกระตุ้นจากระยะไกล


การส่งต่อพอร์ตและการขุดอุโมงค์เป็นส่วนที่ขาดหายไป ตะ. สำคัญมากหากคุณกำลังแก้ไขข้อบกพร่องไปยังเซิร์ฟเวอร์ที่ใช้อินเทอร์เน็ตพูดใน Amazon
PaulNUK

15

เรียกใช้คำสั่งด้านล่างที่pom.xmlวางไว้:

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

และเริ่มแอปพลิเคชัน java ระยะไกลของคุณด้วยตัวเลือกการดีบักบนพอร์ต5005


2
Spring Boot 2.0.3.RELEASEนี้ล้มเหลวที่จะรอการดีบักแนบบน
Stephane

12

ทางออกที่ดีที่สุดในความคิดของฉันคือเพิ่มปลั๊กอินใน pom.xml และคุณไม่จำเป็นต้องทำอะไรเลยตลอดเวลา:

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

แต่จากนั้นคำสั่งmvn clean installทริกเกอร์ดีบักเกอร์และบิลด์แฮงค์ มันจะดีมากถ้ามีเพียงmvnDebug clean installคำสั่งเท่านั้นที่ทำได้
Stephane

1
@Stephane การกำหนดค่านี้น่าจะอยู่ในโปรไฟล์เฉพาะที่เปิดใช้งานได้ง่าย
davidxxx

4
  • คลิกขวาที่โปรเจ็กต์ของคุณแล้วเลือก "Debug As => Java application หรือ Spring boot App" -capture1 - ป้อนคำอธิบายภาพที่นี่
  • หากคุณต้องการให้แอปพลิเคชันของคุณหยุดชั่วคราวในที่ใดที่หนึ่งในแอปของคุณให้ดับเบิลคลิกทางด้านซ้ายคุณจะมีการจับภาพนี้ 2 ป้อนคำอธิบายภาพที่นี่
  • จากนั้นเมื่อคุณเริ่มแอปของคุณให้ใช้ลูกศรเหล่านั้นเพื่อไปต่อ (จับภาพ 3) ป้อนคำอธิบายภาพที่นี่

นี่เป็นคำตอบที่ดีสำหรับคำถามชื่อเรื่อง อย่างไรก็ตามคำอธิบายมีคำถามที่ระบุมากกว่าและแตกต่างกันซึ่งต้องการคำตอบที่แตกต่างกัน
Thor Hovden

ดังนั้นฉันจึงใช้ MyEclispe และตัวเลือก Debug As -> Spring Boot App พร้อมใช้งานและทำงานได้ดี ฉันไม่ได้ใช้ Eclipse Oxygen และรายการเมนู Spring Boot App ไม่สามารถใช้ได้อีกต่อไป ฉันต้องติดตั้งปลั๊กอินสำหรับ eclipse เพื่อรับสิ่งนี้หรือไม่
Kachopsticks

2

โปรดดูhttp://java.dzone.com/articles/how-debug-remote-java-applicatเพื่อเปิดใช้งานการดีบักระยะไกล หากคุณใช้ tomcat เพื่อรันแอปพลิเคชันของคุณให้เริ่ม tomcat ด้วยพารามิเตอร์การดีบักระยะไกลหรือคุณสามารถเริ่ม tomcat ด้วยการสนับสนุน JPDA โดยใช้คำสั่งต่อไป

Windows

<tomcat bin dir>/startup.bat jpda

*ห้าม

<tomcat bin dir>/startup.sh jpda

สิ่งนี้จะเปิดใช้งานการดีบักระยะไกลบนพอร์ต 8000


2

ด้วย eclipse หรือ IDE อื่น ๆ เพียงคลิกขวาที่แอปพลิเคชัน Spring Boot หลักของคุณแล้วคลิก "debug as java application"


2

คำถามนี้ได้รับคำตอบแล้ว แต่ฉันก็มีปัญหาเดียวกันในการดีบัก Springboot + gradle + jHipster

แอปพลิเคชัน Spring boot ส่วนใหญ่สามารถดีบักได้ด้วยการคลิกขวาและดีบัก แต่เมื่อคุณใช้ gradle การมีการตั้งค่าพารามิเตอร์สภาพแวดล้อมเพิ่มเติมจะไม่สามารถดีบักได้โดยตรง

เพื่อแก้ไขปัญหานี้ Eclipse ได้จัดเตรียมคุณลักษณะเพิ่มเติมหนึ่งอย่างเป็นRemote Java Application

โดยใช้คุณสมบัตินี้คุณสามารถดีบักแอปพลิเคชันของคุณ

ทำตามขั้นตอนด้านล่าง:

เรียกใช้แอปพลิเคชัน gradle ของคุณด้วย ./gradlew bootRun --debug-jvmคำสั่ง

ตอนนี้ไปที่ eclipse -> คลิกขวาที่โปรเจ็กต์และการกำหนดค่าดีบัก -> แอปพลิเคชัน Java ระยะไกล

เพิ่มโฮสต์และพอร์ตของคุณเป็น localhost และพอร์ตเป็น 5005 (ค่าเริ่มต้นสำหรับการดีบักแบบ gradle คุณสามารถเปลี่ยนได้)

ดูรายละเอียดและขั้นตอนเพิ่มเติม


2

Right click on the spring boot project -> debug as -> spring boot App. ใส่จุดดีบักเกอร์และเรียกใช้แอปจากลูกค้าเช่นบุรุษไปรษณีย์


0

คลิกขวาที่ไฟล์คลาสหลัก Spring Boot Applications -> เลือกDebug As options -> เลือกJava Application

ป้อนคำอธิบายภาพที่นี่ ตอนนี้คุณสามารถใช้เบรกพอยต์เพื่อดีบักแอปพลิเคชัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.