Aplikasi Spring Debugging

1. Pengenalan

Debugging adalah salah satu alat terpenting untuk menulis perisian.

Dalam tutorial ini, kami akan mengkaji beberapa cara di mana kami dapat men-debug aplikasi Spring.

Kami juga akan melihat bagaimana Spring Boot, pelayan aplikasi tradisional, dan IDE mempermudah ini.

2. Java Debug Args

Pertama, mari kita lihat apa yang diberikan Java kepada kita di luar kotak.

Secara lalai, JVM tidak mengaktifkan penyahpepijatan . Ini kerana debugging menghasilkan overhead tambahan di dalam JVM. Ini juga boleh menjadi masalah keselamatan untuk aplikasi yang dapat diakses oleh umum.

Oleh itu, penyahpepijatan hanya boleh dilakukan semasa pembangunan dan tidak pernah dilakukan pada sistem pengeluaran.

Sebelum kita melampirkan penyahpepijat, kita mesti terlebih dahulu mengkonfigurasi JVM untuk membenarkan penyahpepijatan. Kami melakukan ini dengan menetapkan argumen baris perintah untuk JVM:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

Mari pecahkan maksud setiap nilai ini:

-agentlib: jdwp

Aktifkan ejen Java Debug Wire Protocol (JDWP) di dalam JVM. Ini adalah argumen baris perintah utama yang membolehkan penyahpepijatan.

pengangkutan = dt_socket

Gunakan soket rangkaian untuk sambungan debug. Pilihan lain termasuk soket Unix dan memori bersama.

pelayan = y

Dengarkan sambungan debugger masuk. Apabila ditetapkan ke n , prosesnya akan cuba menyambung ke debugger dan bukannya menunggu sambungan masuk. Argumen tambahan diperlukan apabila ini ditetapkan ke n .

menangguhkan = n

Jangan tunggu sambungan debug semasa permulaan. Aplikasi akan bermula dan berjalan seperti biasa sehingga penyahpepijat dilampirkan. Apabila ditetapkan ke y , proses tidak akan bermula sehingga penyahpepijat dilampirkan.

alamat = 8000

Port rangkaian yang akan didengarkan oleh JVM untuk sambungan debug.

Nilai di atas adalah standard dan akan berfungsi untuk kebanyakan kes penggunaan dan sistem operasi. Panduan sambungan JPDA merangkumi semua nilai yang mungkin dengan lebih terperinci.

3. Aplikasi Spring Boot

Aplikasi Spring Boot boleh dimulakan dengan beberapa cara. Cara paling mudah adalah dari baris arahan menggunakan perintah java dengan pilihan -jar .

Untuk mengaktifkan penyahpepijatan, kami hanya akan menambahkan argumen debug menggunakan pilihan -D :

java -jar myapp.jar -Dagentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

Dengan Maven, kami dapat menggunakan tujuan menjalankan yang disediakan untuk memulakan aplikasi kami dengan debugging diaktifkan:

mvn spring-boot:run -Dagentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

Begitu juga, dengan Gradle, kita dapat menggunakan tugas bootRun . Pertama, kita mesti mengemas kini fail build.gradle untuk memastikan Gradle menyampaikan argumen baris perintah ke JVM:

bootRun { systemProperties = System.properties }

Sekarang kita dapat melaksanakan tugas bootRun :

gradle bootRun -Dagentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

4. Pelayan Aplikasi

Walaupun Spring Boot telah menjadi sangat popular dalam beberapa tahun kebelakangan ini, pelayan aplikasi tradisional masih banyak digunakan dalam seni bina perisian moden. Di bahagian ini, kita akan melihat cara mengaktifkan debug untuk beberapa pelayan aplikasi yang lebih popular.

Sebilangan besar pelayan aplikasi menyediakan skrip untuk memulakan dan menghentikan aplikasi. Mengaktifkan debug biasanya hanya dengan menambahkan argumen tambahan pada skrip ini dan / atau menetapkan pemboleh ubah persekitaran tambahan.

4.1. Tomcat

Skrip permulaan untuk Tomcat dinamakan catalina.sh ( catalina.bat pada Windows). Untuk memulakan pelayan Tomcat dengan debug diaktifkan, kita dapat menambahkan jpda ke argumen:

catalina.sh jpda start

Argumen debug lalai akan menggunakan soket rangkaian yang mendengar pada port 8000 dengan suspend = n . Ini boleh diubah dengan menetapkan satu atau lebih pemboleh ubah persekitaran berikut: JPDA_TRANSPORT , JPDA_ADDRESS , dan JPDA_SUSPEND .

Kami juga dapat mengawal sepenuhnya argumen debug dengan menetapkan JPDA_OPTS . Apabila pemboleh ubah ini ditetapkan, ia diutamakan daripada pemboleh ubah JPDA yang lain. Oleh itu ia mesti menjadi hujah debug lengkap untuk JVM.

4.2. Burung Liar

Skrip permulaan untuk Wildfly adalah stand-alone.sh . Untuk memulakan pelayan Wildfly dengan debug diaktifkan, kita boleh menambah –debug .

Mod debug lalai menggunakan pendengar rangkaian pada port 8787 dengan suspend = n . Kita boleh mengatasi port dengan menentukannya selepas argumen –debug .

Untuk lebih banyak kawalan terhadap argumen debug, kita hanya boleh menambahkan argumen debug lengkap ke pemboleh ubah persekitaran JAVA_OPTS .

4.3. Weblogik

Skrip permulaan untuk Weblogic adalah startWeblogic.sh . Untuk memulakan pelayan Weblogic dengan debug diaktifkan, kita dapat menetapkan debugFlag pemboleh ubah persekitaran ke true .

Mod debug lalai menggunakan pendengar rangkaian pada port 8453 dengan suspend = n . Kita boleh mengatasi port dengan menetapkan pemboleh ubah persekitaran DEBUG_PORT .

Untuk lebih banyak kawalan terhadap argumen debug, kita hanya boleh menambahkan argumen debug lengkap ke pemboleh ubah persekitaran JAVA_OPTIONS .

Versi Weblogic terkini juga menyediakan pemalam Maven untuk memulakan dan menghentikan pelayan. Plugin ini akan menghormati pemboleh ubah persekitaran yang sama dengan skrip permulaan .

4.4. Ikan Gelas

Skrip permulaan untuk Glassfish adalah asadmin . Untuk memulakan pelayan Glassfish dengan debug diaktifkan, kita harus menggunakan –debug :

asadmin start-domain --debug

Mod debug lalai menggunakan pendengar rangkaian pada port 9009 dengan suspend = n .

4.5. Jeti

Pelayan aplikasi Jetty tidak dilengkapi dengan skrip permulaan. Sebaliknya, pelayan Jetty mula menggunakan arahan java .

Oleh itu, mengaktifkan penyahpepijatan semudah menambahkan argumen baris perintah JVM standard.

5. Menyahpepijat dari IDE

Sekarang setelah kita melihat bagaimana mengaktifkan debugging dalam pelbagai jenis aplikasi, mari kita lihat menghubungkan debugger.

Setiap IDE moden menawarkan sokongan penyahpepijatan. Ini termasuk kemampuan untuk memulai proses baru dengan debugging diaktifkan, dan juga kemampuan untuk debug proses yang sudah berjalan.

5.1. IntelliJ

IntelliJ menawarkan sokongan kelas pertama untuk aplikasi Spring and Spring Boot. Debugging semudah menavigasi ke kelas dengan kaedah utama , mengklik kanan ikon segitiga, dan memilih Debug.

Sekiranya projek mengandungi banyak aplikasi Spring Boot, IntelliJ akan menyediakan tetingkap alat Run Dashboard. Tetingkap ini membolehkan kita men-debug beberapa aplikasi Spring Boot dari satu tempat:

Untuk aplikasi yang menggunakan Tomcat atau pelayan web lain, kami dapat membuat konfigurasi khusus untuk melakukan debug. Di bawah Jalankan > Edit Konfigurasi , terdapat sejumlah templat untuk pelayan aplikasi yang paling popular:

Akhirnya, IntelliJ menjadikannya sangat mudah untuk menyambung ke proses yang sedang berjalan dan menyahpepijatnya. Selagi aplikasi dimulakan dengan argumen debug yang tepat , IntelliJ dapat menyambung ke sana, walaupun ada di host lain.

Pada layar Run / Debug Configurations , templat Jauh akan membiarkan kita mengkonfigurasi cara melampirkan ke aplikasi yang sudah berjalan:

Perhatikan bahawa IntelliJ hanya perlu mengetahui nama host dan port debug. Sebagai kemudahan, ia memberitahu kita argumen baris perintah JVM yang betul yang harus digunakan pada aplikasi yang ingin kita debug.

5.2. Gerhana

Cara paling cepat untuk men-debug aplikasi Spring Boot di Eclipse adalah dengan mengklik kanan kaedah utama dari tetingkap Explorer Explorer atau Outline :

Pemasangan lalai Eclipse tidak menyokong Spring atau Spring Boot di luar kotak. Walau bagaimanapun, terdapat alat tambahan Spring Tools di Eclipse Marketplace yang memberikan sokongan Spring setanding dengan IntelliJ.

Terutama add-on menyediakan Boot Dashboard yang membolehkan kami menguruskan banyak aplikasi Spring Boot dari satu tempat :

Tambahan ini juga menyediakan Spring Boot Run / Debug Configuration yang membolehkan menyesuaikan debug dari satu aplikasi Spring Boot. Paparan khusus ini tersedia dari semua tempat yang sama dengan konfigurasi Aplikasi Java standard .

Untuk men-debug proses yang sudah berjalan, baik secara lokal atau pada host jarak jauh, kita dapat menggunakan konfigurasi Aplikasi Java Jauh :

6. Menyahpepijat Dengan Docker

Menyahpepijat aplikasi Spring di dalam bekas Docker mungkin memerlukan konfigurasi tambahan. Sekiranya kontena berjalan secara tempatan dan tidak menggunakan mod rangkaian host , maka port debug tidak akan dapat diakses di luar wadah.

Terdapat beberapa cara untuk mendedahkan port debug di Docker.

Kita dapat menggunakan – expose dengan perintah docker run :

docker run --expose 8000 mydockerimage

Kami juga boleh menambah mendedahkan arahan kepada Dockerfile :

EXPOSE 8000

Atau jika kita menggunakan Docker Compose, kita boleh menambahkannya ke dalam YAML:

expose: - "8000"

7. Kesimpulannya

Dalam artikel ini, kami telah melihat cara mengaktifkan debug untuk aplikasi Java apa pun.

Dengan hanya menambahkan satu argumen baris perintah, kita dapat men-debug aplikasi Java dengan mudah.

Kami juga melihat bahawa kedua-dua Maven dan Gradle, serta IDE yang paling popular, semuanya mempunyai alat tambah khusus untuk menjadikan aplikasi debugging Spring dan Spring Boot menjadi lebih mudah.