Ini adalah halaman ikhtisar, silakan kunjungi hotswapagent.org untuk informasi lebih lanjut.
Kelas runtime Java tanpa batas dan redefinisi sumber daya.
Tujuan utama dari proyek ini adalah untuk menghilangkan kebutuhan akan siklus pengembangan tradisional "ubah kode -> mulai ulang dan tunggu... -> periksa". Seiring berjalannya waktu, konsep ini telah berkembang menjadi paradigma baru dalam ekosistem Java, yang memungkinkan pengembangan perangkat lunak secara real-time dalam aplikasi yang sedang berjalan. Pendekatan ini bahkan dapat dilakukan di lingkungan terbatas, seperti container Docker.
Jika Anda pengguna IntelliJ, Anda dapat menyederhanakan pengaturan HA dan DCEVM dengan menggunakan plugin IntelliJ HotSwapHelper.
Unduh dan Instal:
Untuk Java 17/21: Unduh JBR17 atau JBR21 terbaru. Karena versi ini tidak menyertakan Agen Hotswap bawaan, Anda perlu menyalin hotswap-agent.jar
secara manual ke folder lib/hotswap
. Anda dapat menemukan Agen Hotswap terbaru di sini. Pastikan file di folder lib/hotswap
diberi nama hotswap-agent.jar
tanpa nomor versi apa pun di nama file.
Untuk Java 11: Gunakan TravaJDK, yang memiliki HotswapAgent terintegrasi, dan instal sebagai JDK alternatif. Alternatifnya, TravaJDK menyertakan HotswapAgent yang tertanam.
Untuk Java 8: Gunakan jdk8-dcevm bersama dengan HotswapAgent.
Mode Agen Hotswap:
Dimulai dengan dcevm-11.0.9
, HotswapAgent dinonaktifkan secara default. Anda dapat mengaktifkan dukungan untuk HotswapAgent menggunakan opsi JVM dalam salah satu dari tiga mode:
Mode HotswapAgent=core
beroperasi tanpa plugin tambahan, kecuali untuk plugin inti JVM, menghasilkan kinerja yang lebih cepat karena berkurangnya tugas pemindaian dan penyalinan kelas. Untuk menggunakan plugin tambahan, Anda perlu mengonfigurasinya sebagai dependensi Maven di file pom.xml
Anda. Di sisi lain, mode HotswapAgent=fatjar
menyertakan semua plugin secara default, yang mungkin sedikit memperlambat startup aplikasi.
-XX:HotswapAgent=fatjar
mengaktifkan hotswapAgent fatjar internal.
-XX:HotswapAgent=core
mengaktifkan HotswapAgent inti internal.
-XX:HotswapAgent=external
mengonfigurasi dukungan JVM untuk HotswapAgent dan memungkinkan pengguna menyediakan hotswap-agent.jar
eksternal menggunakan opsi -javaagent:
.
3.Peluncuran:
Java17/21: luncurkan aplikasi Anda dengan opsi -XX:+AllowEnhancedClassRedefinition -XX:HotswapAgent=fatjar
untuk mengaktifkan hotswap lanjutan (dcevm) dan menggunakan rilis fatjar Agen Hotswap. Sebagai alternatif mode core
atau external
dapat digunakan sebagai pengganti fatjar
.
Java11: luncurkan aplikasi Anda dengan opsi -XX:HotswapAgent=fatjar
untuk menggunakan rilis fatjar Agen Hotswap.
Java8: luncurkan aplikasi Anda dengan opsi -XXaltjvm=dcevm -javaagent:hotswap-agent.jar
untuk mendapatkan pengaturan dasar. Secara opsional, Anda dapat menambahkan hotswap-agent.properties
ke aplikasi Anda untuk mengonfigurasi plugin dan perilaku agen.
3.Jalankan aplikasi Anda:
Mulai aplikasi dalam mode debug, periksa apakah agen dan plugin diinisialisasi dengan benar:
HOTSWAP AGENT: 9:49:29.548 INFO (org.hotswap.agent.HotswapAgent) - Loading Hotswap agent - unlimited runtime class redefinition. HOTSWAP AGENT: 9:49:29.725 INFO (org.hotswap.agent.config.PluginRegistry) - Discovered plugins: [org.hotswap.agent.plugin.hotswapper.HotswapperPlugin, org.hotswap.agent.plugin.jvm.AnonymousClassPatchPlugin, org.hotswap.agent.plugin.hibernate.HibernatePlugin, org.hotswap.agent.plugin.spring.SpringPlugin, org.hotswap.agent.plugin.jetty.JettyPlugin, org.hotswap.agent.plugin.tomcat.TomcatPlugin, org.hotswap.agent.plugin.zk.ZkPlugin, org.hotswap.agent.plugin.logback.LogbackPlugin] ... HOTSWAP AGENT: 9:49:38.700 INFO (org.hotswap.agent.plugin.spring.SpringPlugin) - Spring plugin initialized - Spring core version '3.2.3.RELEASE'
4.Periksa redefinisi
Simpan sumber daya yang diubah dan/atau gunakan fitur HotSwap IDE Anda untuk memuat ulang perubahan
Setiap kerangka aplikasi (Spring, Hibernate, Logback, ...) memerlukan mekanisme pemuatan ulang khusus agar tetap up-to-date setelah redefinisi kelas (misalnya memuat ulang konfigurasi Hibernate setelah kelas entitas baru diperkenalkan). Agen hotswap berfungsi sebagai sistem plugin dan dikirimkan dengan konfigurasi awal dengan semua plugin kerangka utama. Sangat mudah untuk menulis plugin khusus Anda bahkan sebagai bagian dari aplikasi Anda.
Proyek ini sangat kompleks karena banyak framework yang didukung dan versi yang beragam. Kontribusi masyarakat adalah hal yang wajib untuk menjaganya tetap hidup. Anda dapat memulai dengan membuat plugin di dalam aplikasi Anda atau dengan menulis contoh/uji integrasi. Selalu ada kebutuhan untuk perbaikan dokumentasi :-). Terima kasih atas bantuannya!
Hotswap Java yang Ditingkatkan - mengubah isi metode, menambah/mengganti nama metode, bidang, ...Satu-satunya operasi yang tidak didukung adalah mengubah superkelas.
Anda dapat menggunakan Java Hotswap standar dari IDE dalam mode debug untuk memuat ulang kelas yang diubah
atau atur properti autoHotswap -XXaltjvm=dcevm -javaagent:PATH_TO_AGENThotswap-agent.jar=autoHotswap=true
untuk memuat ulang kelas yang diubah setelah kompilasi. Pengaturan ini bahkan memungkinkan memuat ulang pada sistem produksi tanpa memulai ulang.
Konfigurasi otomatis - semua kelas dan sumber daya lokal, yang diketahui oleh aplikasi Java yang sedang berjalan, secara otomatis ditemukan dan diawasi untuk dimuat ulang (semua file di sistem file lokal, bukan di dalam file JAR).
Classpath ekstra - Perlu mengubah kelas runtime di dalam JAR dependen? Gunakan properti extraClasspath untuk menambahkan direktori apa pun sebagai classpath untuk mengawasi file kelas.
Muat ulang sumber daya setelah perubahan - sumber daya dari direktori webapp biasanya dimuat ulang oleh server aplikasi. Namun bagaimana dengan sumber daya lain seperti src/main/resources? Gunakan properti watchResources untuk menambahkan direktori apa pun untuk mengamati perubahan sumber daya.
Dukungan kerangka kerja - melalui sistem plugin, banyak kerangka kerja yang didukung. Plugin baru dapat dengan mudah ditambahkan.
Cepat - hingga plugin diinisialisasi, plugin tidak menghabiskan sumber daya apa pun atau memperlambat aplikasi (lihat Overhead runtime untuk informasi lebih lanjut)
Jika Anda mempunyai masalah atau pertanyaan, tanyakan di forum HotswapAgent.
Proyek ini mirip dengan JRebel. Perbedaan utamanya adalah:
HotswapAgent (DCEVM) mendukung Java8, Java11 dan Java17!
HotswapAgent tidak memerlukan konfigurasi tambahan apa pun untuk pengaturan proyek dasar.
JRebel saat ini lebih matang dan berisi lebih banyak plugin.
JRebel bukanlah open source atau gratis.
JRebel memodifikasi bytecode semua kelas saat memuat ulang. Anda memerlukan plugin IDE khusus untuk memperbaiki debugging.
HotswapAgent extraClasspath mirip dengan konfigurasi JRebel
HotswapAgent menambahkan konfigurasi watchResources
Lihat proyek GitHub HotswapAgentExamples. Tujuan dari contoh aplikasi adalah:
pengujian integrasi otomatis yang kompleks (periksa berbagai konfigurasi sebelum rilis, lihat skrip run-tests.sh
)
untuk memeriksa penggunaan plugin "dunia nyata" selama pengembangan plugin (yaitu di dalam wadah)
untuk memberikan solusi yang berfungsi untuk pengaturan aplikasi umum
sandbox untuk menyimulasikan masalah pada penyiapan yang sudah ada atau yang baru
Jangan ragu untuk melakukan fork/cabang dan membuat aplikasi untuk pengaturan Anda (fungsional, tetapi sesederhana mungkin). Pengaturan umum akan digabungkan ke dalam master.
Tidak ada yang diperlukan :) Sungguh! Semua perubahan bersifat transparan dan yang perlu Anda lakukan hanyalah mengunduh patch+agent dan menyiapkan aplikasi/server aplikasi Anda. Karena kami menggunakan perilaku hotswap java standar, IDE Anda akan berfungsi seperti yang diharapkan. Namun, kami mengerjakan plugin IDE untuk membantu pengunduhan & konfigurasi.
Beberapa plugin sudah tersedia:
Tambahkan dua tindakan di sebelah tombol "Debug" di intellij, Jalankan dengan hotswap, Debug dengan hotswap.
Saat mengklik tindakan, akan menyetel parameter vm untuk Anda, tidak perlu menyetel parameter vm secara manual.
Kode sumber dan dokumentasi: https://github.com/gejun123456/HotSwapHelper.
Konfigurasi dasar diatur untuk memuat ulang kelas dan sumber daya dari jalur kelas yang diketahui oleh aplikasi yang sedang berjalan (pemuat kelas). Jika Anda memerlukan konfigurasi yang berbeda, tambahkan file hotswap-agent.properties ke root classpath (misalnya src/main/resources/hotswap-agent.properties
).
Dokumentasi detail tentang properti yang tersedia dan nilai default dapat ditemukan di file properti agen
Sintaks lengkap opsi baris perintah adalah:
-javaagent:[yourpath/]hotswap-agent.jar=[option1]=[value1],[option2]=[value2]
Agen hotswap menerima opsi berikut:
autoHotswap=true - perhatikan semua file .class untuk perubahan dan secara otomatis melakukan Hotswap kelas dalam aplikasi yang sedang berjalan (alih-alih menjalankan Hotswap dari sesi debugging IDE Anda)
disablePlugin=[pluginName] - nonaktifkan plugin. Perhatikan bahwa ini akan sepenuhnya melarang plugin untuk dimuat (berlawanan dengan opsi menonaktifkan Plugin di hotswap-agent.properties, yang hanya akan menonaktifkan plugin untuk classloader. Anda dapat mengulangi opsi ini untuk menonaktifkan setiap plugin.
Tambahkan opsi vm -Dhotswapagent.disablePlugin=Spring,SpringBoot untuk menonaktifkan plugin, berfungsi sama seperti opsi agendisablePlugin di bagian sebelumnya.
Agen hotswap melakukan pekerjaan memuat ulang sumber daya dan konfigurasi kerangka kerja (Spring, Hibernate, ...), tetapi itu bergantung pada mekanisme hotswap Java standar untuk memuat ulang kelas. Hotswap Java standar hanya mengizinkan metode perubahan isi, yang membuatnya praktis tidak dapat digunakan. DCEVM adalah patch JVM (Hotspot) yang memungkinkan hampir semua perubahan kelas struktural di hotswap (dengan pengecualian perubahan hierarki). Meskipun agen hotswap bekerja bahkan dengan java standar, kami menyarankan penggunaan DCEVM (dan semua tutorial menggunakan DCEVM sebagai target JVM).
Agen hotswap adalah wadah plugin dengan pengelola plugin, registri plugin, dan beberapa layanan agen (misalnya untuk mengawasi perubahan kelas/sumber daya). Ini membantu dengan tugas-tugas umum dan masalah pemuatan kelas. Ini memindai classpath untuk kelas yang dianotasi dengan anotasi @Plugin, menyuntikkan layanan agen, dan mendaftarkan memuat ulang kait. Modifikasi bytecode runtime disediakan oleh perpustakaan javaasit.
Plugin yang dikelola oleh Agen Hotswap biasanya berfokus pada kerangka kerja tertentu. Misalnya, plugin Spring menggunakan layanan HA untuk:
Ubah kelas root Spring untuk mendapatkan konteks Spring dan jalur pemindaian terdaftar
Perhatikan perubahan sumber daya apa pun pada jalur pemindaian
Perhatikan hotswap file kelas dalam paket jalur pemindaian
Muat ulang definisi kacang setelah perubahan
... dan banyak lainnya
CXF-JAXRS (3.x) - mendefinisikan ulang sumber daya JAXRS setelah redefinisi kelas sumber daya, memasukkan kembali instance jika terintegrasi dengan Spring dan CDI (Weld/OWB).
Deltaspike (1.x,2.x) - pesan, ViewConfig, repositori, pemuatan ulang proxy. Penginjeksian ulang kacang CDI cakupan Deltaspike.
ELResolver (2.x-5.x) (JuelEL, Appache Commons EL, Oracle EL 3.0)- bersihkan cache ELResolver pada perubahan kelas. Mendukung hotswap untuk ekspresi #{...}.
FreeMarker - bersihkan cache introspeksi kelas kacang Apache Freemarker pada perubahan definisi kelas.
Hibernate (3.x-6.x) - Muat ulang konfigurasi Hibernate setelah pembuatan/perubahan entitas.
iBatis - memuat ulang konfigurasi iBatis.
IDEA - dukungan untuk pengembangan IntelliJ IDEA di IDEA
Jackson - menghapus cache internal jackson ketika kelas didefinisikan ulang.
Jersey1 - memuat ulang wadah Jersey1 setelah definisi atau definisi ulang sumber daya root atau kelas penyedia.
Jersey2 - memuat ulang wadah Jersey2 setelah definisi atau definisi ulang sumber daya root atau kelas penyedia.
Logback - Muat ulang konfigurasi logback.
Log4j2 - memuat ulang konfigurasi Log4j2.
Mojarra (2.x) - dukungan untuk perubahan bundel sumber daya aplikasi (file properti). Dukungan untuk injeksi ulang/pemuatan ulang kacang ViewScoped.
MyBatis (5.3) - memuat ulang konfigurasi setelah file mapper berubah
MyFaces (2.x-4.x) - dukungan untuk perubahan bundel sumber daya aplikasi (file properti). Dukungan untuk injeksi ulang/pemuatan ulang kacang ViewScoped.
OmniFaces - dukungan untuk injeksi ulang/pemuatan ulang kacang ViewScoped.
OpenWebBeans - (CDI) (1.x-4.x) - memuat ulang definisi kelas kacang setelah definisi/perubahan kelas. Kacang dapat dimuat ulang sesuai strategi yang ditentukan dalam file properti.
OsgiEquinox - Dukungan hotswap untuk plugin Eclipse atau pengembangan platform Eclipse.
RestEasy (2.x, 3.x) - Membersihkan dan mendaftarkan redefinisi kelas.
Spring (3.2.x+, 4.x, 5.x) - Muat ulang konfigurasi Spring setelah definisi/perubahan kelas.
Spring Boot (1.5.x+, 2.0.x) - Pemuatan ulang dinamis file konfigurasi Spring Boot secara real-time.
Vaadin (23.x, 24.x) - Perbarui rute, model templat, dan dalam praktiknya, apa pun dengan cepat.
WebObjects - Hapus cache kode nilai kunci, komponen, tindakan, dan validasi setelah perubahan kelas.
Weld (CDI) (2.x-5.x) - memuat ulang definisi kelas kacang setelah definisi/perubahan kelas. Kacang dapat dimuat ulang sesuai strategi yang ditentukan dalam file properti.
Gawang - bersihkan cache gawang jika file properti diubah
WildFlyELResolver - Hapus BeanELResolver setelah redefinisi kelas apa pun.
ZK (5x-7x) - Kerangka ZK (http://www.zkoss.org/). Ubah nilai default properti perpustakaan untuk menonaktifkan cache, mempertahankan cache Label dan cache pemecah kacang.
JBossModules - tambahkan jalur kelas tambahan ke pemuat kelas modul JBoss. (Lalat liar)
Jetty - tambahkan classpath tambahan ke classloader aplikasi. Semua versi yang mendukung WebAppContext.getExtraClasspath harus didukung.
Tomcat (7.x,8.x,9.x,10.x) mengkonfigurasi Apache Tomcat dengan extraClasspath dan properti webApp. Mendukung juga GlassFish, Payara dan Tomee7.
Undertow - tambahkan classpath tambahan, watchResources, dan webappDir ke pengelola sumber daya arus.
Weblogic - tambahkan classpath tambahan ke classloader aplikasi.
AnonymousClassPatch - Tukar nama kelas dalam anonim untuk menghindari perubahan yang tidak kompatibel.
ClassInit - menginisialisasi nilai anggota/enum statis baru setelah redefinisi kelas/enum dan mempertahankan nilai statis. (Perbaikan batasan DCEVM yang diketahui)
Hotswapper - Perhatikan perubahan file kelas apa pun dan muat ulang (hotswap) dengan cepat melalui Java Platform Debugger Architecture (JPDA)
Proxy (didukung com.sun.proxy, CGlib) - mendefinisikan ulang kelas proxy yang mengimplementasikan atau memperluas antarmuka atau kelas yang diubah.
Temukan dokumentasi rinci setiap plugin di file README.md utama proyek plugin.
Itu tergantung pada berapa banyak kerangka kerja yang Anda gunakan dan cache mana yang dinonaktifkan. Contoh pengukuran untuk aplikasi perusahaan besar di dunia nyata berdasarkan Spring + Hibernate, dijalankan di Jetty.
Setup | Startup time -----------------------------|------------- Run (plain Java) | 23s Debug (plain Java) | 24s Debug (plain DCEVM) | 28s Agent - disabled all plugins | 31s Agent - all plugins | 35s
Anda dapat menulis plugin secara langsung sebagai bagian dari aplikasi Anda. Setel pluginPackages=your.plugin.package
di dalam konfigurasi hotswap-agent.properties
Anda untuk menemukan kelas beranotasi @Plugin
. Anda juga memerlukan ketergantungan agen JAR untuk dikompilasi, tetapi berhati-hatilah untuk TIDAK menambahkan JAR ke aplikasi Anda; itu harus dimuat hanya sebagai javaagent. Ketergantungan Maven:
org.hotswapagent HotswapAgent ${project.version} provided
Lihat ContohPlugin (bagian dari TestApplication) untuk melihat plugin sederhana yang dikomentari. Baca agen readme untuk memahami konsep agen. Periksa kode sumber plugin yang ada untuk contoh lainnya.
Luncurkan skrip run-tests.sh
di direktori utama. Saat ini, Anda harus mengatur direktori lokasi JAVA_HOME secara manual. Setidaknya Java 11 dengan DCEVM harus diperiksa sebelum rilis. Semua pengujian otomatis diatur untuk menggagalkan seluruh skrip jika terjadi kegagalan pengujian tunggal.
Buka direktori yang mewakili root repositori. Seandainya DCEVM diberi nama dcevm
mvn release:prepare mvn release:perform
Agen hotswap:
Jiri Bubnik - koordinator proyek, implementasi awal
Alexandros Papadakis - Versi Maven, Weld, JSF, Hibernate3, RestEasy, plugin WildFly
Erki Ehtla - Plugin pegas, plugin Proksi
Vladimir Dvorak - ELResolver, OsgiEquinox, Weld, Owb, Deltaspike, Jvm, Jdk, JBossModules, ClassInit, JSF, Mybatis
Sergey Lysenko - Plugin las
Samuel Pelletier - plugin WebObjects
Jan Tecl - desain web
@liuzhengyang - plugin jackson
Lukasz Warzecha - Plugin Log4j2
@muwaiwai - plugin iBatis
Thomas Heigl - Plugin gawang
AJ Banck - plugin FreeMarker
Sinan Yumak - Mojarra, plugin MyFaces
smallfour - plugin Mybatis
@cvictory - Plugin pegas, plugin Spring Boot
@homejim - Plugin MyBatis, plugin MyBatisPlus
DCEVM:
Thomas Würthinger - implementasi awal.
Ivan Dubrov - mantan koordinator proyek, perbarui ke Java7+Java8, patch, sistem build (Gradle)
Kerstin Breitender - kontributor.
Christoph Wimberger - kontributor.
Vladimir Dvorak - migrasi java9,java11,jbr17,jbr21, kontributor
Jiri Bubnik - migrasi java9,java11